コンストラクターを一緒にチェーンする必要があります。最小のパラメーターを持つコンストラクターから、すべてが指定されたコンストラクターにチェーンすることをお勧めします。
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 にしました。クラスを完全に不変にすることができれば、それらについて推論するときに役立ちます。多くのフィールドを持つクラスの場合、可変ビルダーでプロパティを設定し、そこから不変オブジェクトを構築するビルダー パターンの使用を検討することをお勧めします。