11

通常、次のように Java でビルダー パターンを使用します。

UserBuilder userBuilder = new UserBuilder();
User John = userBuiler.setName("John")
                      .setPassword("1234")
                      .isVip(true)
                      .visableByPublic(false)
                      .build();

属性にはデフォルト値があるものとないものがあります。

マップで属性を渡すことは解決策かもしれませんが、引数が非常に長くなります。

(def john (make-user {:name "John" :pass "1234" :vip true :visible false}))

だから、私の質問は、これを達成するエレガントな方法はありますか?

4

5 に答える 5

9

何らかの clojure 構造を構築したい場合は、関数の引数で分割パターンを使用できます。その後、すでに書いたのと同様のことを達成します。

(defn make-user [& {:keys [name pass vip visible]}]
  ; Here name, pass, vip and visible are regular variables
  ; Do what you want with them
)

(def user (make-user :name "Name" :pass "Pass" :vip false :visible true))

これよりも少ないコードで何かできるとは思えません。

Java オブジェクトを (セッターを使用して) 構築したい場合は、Nicolas が提案したアプローチを使用できます。

于 2012-09-28T05:15:02.737 に答える
4

私は通常、マップを介して属性を渡します。属性マップは実際には make-user 関数への引数の 1 つにすぎないため、これを行うことに実際の問題はありません。デフォルト属性でのマージなど、make-user 内で便利なこともできます。

このようなマップをビルダー パターンで作成したい場合は、次のようにスレッド マクロを使用して作成できます。

(def john 
  (-> {}
    (assoc :name "John")
    (assoc :pass "1234")
    (assoc :vip true)
    (assoc :visible false)
    make-user))
于 2012-09-28T05:41:35.720 に答える
4

リライト

(def john (make-user {:name "John" :pass "1234" :vip true :visible false}))

複数の行に:

(def john (make-user {:name "John" 
                      :pass "1234" 
                      :vip true 
                      :visible false}))
于 2012-09-28T09:26:43.630 に答える
2

簡単な方法はdotoマクロを使用することです:

配列リストにいくつかの値を入力する例を次に示します。

(def al (doto (java.util.ArrayList.) (.add 11) (.add 3)(.add 7)))

Stuart は、Swing で doto を使用する方法に関するいくつかの完璧な例を提供しています。ここにパネルがあります:

(doto (JPanel.)
            (.setOpaque true)
            (.add label)
            (.add button))

ここにフレームがあります:

(doto (JFrame. "Counter App")
  (.setContentPane panel)
  (.setSize 300 100)
  (.setVisible true))
于 2012-09-28T05:05:01.533 に答える