私はこのように書かれたほとんどの不変のPOJOを見ます:
_public class MyObject {
private final String foo;
private final int bar;
public MyObject(String foo, int bar) {
this.foo = foo;
this.bar = bar;
}
public String getFoo() {
return foo;
}
public int getBar() {
return bar;
}
}
_
しかし、私はこのように書く傾向があります:
_public class MyObject {
public final String foo;
public final int bar;
public MyObject(String foo, int bar) {
this.foo = foo;
this.bar = bar;
}
}
_
参照は最終的なものなので、オブジェクトは依然として不変であることに注意してください。それは私がより少ないコードを書くことを可能にし、より短い(5文字:get
および_()
_)アクセスを許可します。
私が見ることができる唯一の欠点は、あなたがgetFoo()
の実装を変更して、奇妙なことをしたいのであれば、それができないことです。しかし現実的には、オブジェクトが不変であるため、これは決して起こりません。インスタンス化中に確認し、インスタンス化中に不変の防御コピーを作成して(たとえば、GuavaのImmutableList
を参照)、foo
またはbar
オブジェクトをget
呼び出しの準備ができます。
私が見逃している欠点はありますか?
[〜#〜]編集[〜#〜]
私が見逃しているもう1つの欠点は、get
またはis
で始まるメソッドに対するリフレクションを使用するシリアル化ライブラリーであると思いますが、それはかなりひどい習慣です...
私が考えることができる4つの欠点:
そうは言っても、あなたのバージョンは間違いなくもっと簡潔です。これが特定のパッケージ内でのみ使用される特殊なクラスである場合(パッケージのスコープはここでは良い考えかもしれません)、私はこれを1回限りのことと考えます。しかし、私はこのような主要なAPIを公開しません。
ゲッター/セッターも削除して、元気です!
これは、Javaプログラマの間で非常に物議を醸しているトピックです。
とにかく、ゲッター/セッターの代わりにパブリック変数(!)を使用する2つの状況があります。
素人の言葉で:
私が手短に見ることができる1つの考えられる欠点は、クラス内のデータの内部表現に縛られていることです。これは大した問題ではないかもしれませんが、セッターを使用して、fooとbarが別の場所で定義された他のクラスから返されると決めた場合、MyObjectを使用するクラスを変更する必要はありません。 MyObjectに触れるだけで済みます。ただし、ネイキッドな値を使用する場合、MyObject iが使用したすべての場所に触れる必要があります。