2

次のような簡単な書き方があるように感じずにはいられません。

public abstract class MessageBase
{
    public String Destination, Sender = "", Uid = "";

    public MessageBase(String destination)
    {
        this.Destination = destination;
    }

    public MessageBase(String destination, String uid)
    {
        this.Destination = destination;
        this.Uid = uid;
    }
}

これをもっと「コンパクトに」書くことは可能ですか?

4

2 に答える 2

4

これは、コンストラクターをネストするための優れたアプローチです。ここでのコードは少し短くなるだけですが、保守がはるかに簡単になります。

public String destination;
public sender = "";
public uid = "";

public MessageBase(String destination){
    this.destination = destination;
}

public MessageBase(String destination, String uid){
    this(destination);
    this.uid= uid;
}

小文字で始まるように変数名を変更する必要があります。

通常、1 行に 1 つの変数のみを宣言します。

@Jon Skeet が示唆しているように、コンストラクターのチェーンを逆にすることができます (より少ない呼び出しが多い)。どのチェーンを使用するかはあなた次第です。

于 2013-05-05T11:33:06.413 に答える
3

コンストラクターを一緒にチェーンする必要があります。最小のパラメーターを持つコンストラクターから、すべてが指定されたコンストラクターにチェーンすることをお勧めします。

public abstract class MessageBase {
    private final String destination;
    private final String uid;
    private String sender;

    public MessageBase(String destination) {
        // Invoke the more parameterized constructor
        this(destination, "");
    }

    public MessageBase(String destination, String uid) {
        this.destination = destination;
        this.uid = uid;
    }

    public void setSender(String sender) {
        this.sender = sender;
    }

    // etc
}

このように、すべてのコンストラクターは、フィールドを設定する唯一の場所である単一の「マスター」コンストラクターを通過することになります。これは、各コンストラクターがいくつかのフィールドを設定するだけのwhoAmIの回答のスタイルよりも従うのが簡単だと思います。また、連鎖コンストラクター呼び出しで指定されているため、既定値が何であるかを簡単に確認できます。

また、当然のことながら、フィールドをプライベートにしています (そして、Java の命名規則に従って名前を付けています)。また、コンストラクターで設定されたフィールドを final にしました。クラスを完全に不変にすることができれば、それらについて推論するときに役立ちます多くのフィールドを持つクラスの場合、可変ビルダーでプロパティを設定し、そこから不変オブジェクトを構築するビルダー パターンの使用を検討することをお勧めします。

于 2013-05-05T11:39:56.127 に答える