7

これは、ITEM 40 の一部を理解するための試みです。Effective Java 2nd Edition から慎重にメソッド シグネチャを設計します。

メソッド シグネチャの読みやすさを改善するために提案されていることの 1 つは、4 つ以下のパラメーターを目指すことです。より長いパラメーター リストは、次のようなさまざまな手法を使用して管理することをお勧めします。

最初の 2 つの側面を組み合わせた 3 つ目の手法は、Builder パターン (項目 2) をオブジェクト構築からメソッド呼び出しに適応させることです。多くのパラメーターを持つメソッドがある場合、特にその一部がオプションの場合、すべてのパラメーターを表すオブジェクトを定義し、クライアントがこのオブジェクトに対して複数の「セッター」呼び出しを行うことができるようにすると、有益な場合があります。単一のパラメーターまたは関連する小さなグループを設定します。目的のパラメータが設定されると、クライアントはオブジェクトの「execute」メソッドを呼び出します。これにより、パラメータの最終的な有効性チェックが行われ、実際の計算が実行されます。

オブジェクトの構築に使用される Builder パターンには精通していますが、それをメソッド呼び出しに適応させる方法を正しく理解しているかどうかはわかりません。

ここに私がこれまでに持っているものがあります:(
メソッドのメソッド呼び出しを改善しようとしましたmove)

public class Space {

    public static class Builder {
        // Required parameters
        private final int x;
        private final int y;
        private final int z;

        // optional params
        private long time = 0;

        public Builder(int x, int y, int z) {
            this.x = x;
            this.y = y;
            this.z = z;
        }

        public Builder time(long val) {
            time = val;
            return this;
        }

        public void move() {
            if (x == 0 || y == 0 || z == 0) {
                throw new IllegalArgumentException("Cannot move to the centre of the universe");
            }

            // Do the actual work here
        }
    }

//  public void move(int x, int y, int z, long time) {
//      // Do the work here
//  }

    public static void main(String[] args) {
        new Builder(1, 1, -1).time(1234).move();
    }
}

Joshua Bloch のアドバイスに対する私の解釈は正しいですか?

4

3 に答える 3

2

私の見方では、ビルダークラスを親クラスに関連付け(非静的内部クラスのように)、クライアントは次のように使用します。

Space space = new Space();
...
Space.MoveBuilder moveBuilder = space.new MoveBuilder(1, 1, -1);
moveBuilder.setTime(1234);
moveBuilder.execute();

流暢なビルダーとファクトリメソッドを使用することで、さらに単純化できます。

space.startMove(1, 1, -1).withTime(1234).endMove();
于 2012-12-21T00:34:26.167 に答える