Saya melihat POJO paling abadi ditulis seperti ini:
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;
}
}
Namun saya cenderung menulisnya seperti ini:
public class MyObject {
public final String foo;
public final int bar;
public MyObject(String foo, int bar) {
this.foo = foo;
this.bar = bar;
}
}
Perhatikan referensi bersifat final, sehingga Object tetap tidak berubah. Ini memungkinkan saya menulis lebih sedikit kode dan memungkinkan lebih pendek (dengan 5 karakter: getdan ()) akses.
Satu-satunya kelemahan yang bisa saya lihat adalah jika Anda ingin mengubah implementasi getFoo()jalan untuk melakukan sesuatu yang gila, Anda tidak bisa. Tetapi secara realistis, ini tidak pernah terjadi karena Objek tidak dapat diubah; Anda dapat memverifikasi selama instantiasi, membuat salinan defensif yang tidak berubah selama instantiasi (lihat ImmutableListcontoh Guava ), dan menyiapkan fooatau barobjek untuk getpanggilan.
Apakah ada kerugian yang saya lewatkan?
SUNTING
Saya kira kerugian lain yang saya lewatkan adalah serialisasi perpustakaan menggunakan refleksi atas metode yang dimulai dengan getatau is, tapi itu praktik yang sangat mengerikan ...
String, intatau MyObject. Di versi pertama, finalhanya untuk memastikan bahwa metode selain konstruktor di dalam kelas tidak mencoba bar = 7;, misalnya. Dalam versi kedua, finaldiperlukan untuk mencegah konsumen dari melakukan: MyObject x = new MyObject("hi", 5); x.bar = 7;.
Objectmasih tetap. " Menyesatkan - dengan cara itu tampaknya Anda berpikir ada yang final Objecttidak berubah, padahal tidak. Maaf atas kesalahpahaman ini.
myObj.getFoo().setFrob(...).
finaltidak membuat variabel objek tidak berubah. Saya biasanya menggunakan desain di mana saya mendefinisikanfinalbidang sebelum membuat panggilan balik sehingga panggilan balik dapat mengakses bidang itu. Itu bisa, tentu saja memanggil semua metode termasuksetXmetode apa pun .