Nasıl Java değişmez nesneleri oluşturmak için?
Nasıl Java değişmez nesneleri oluşturmak için?
Nesneler değişmez aranmalıdır?
Eğer varsa tüm statik üyeleri ile sınıf değişmez mi?
CEVAP
Aşağıdazorbir değişmez gereksinimleri nesne.
- Sınıf final yapmak
- tüm üyeler son olun, onları ayarlayın açıkça, yapıcı bir statik blok, veya
- Bütün üyelerine özel
- Durumu değiştiren hiçbir Yöntem
- Üye Olmak(alan
final
olabilir unutma ama nesne hala da değişken olabilir. değişken erişimi sınırlamak için son derece dikkatli yaniprivate final Date imStillMutable
). Bu durumdadefensive copies
yapmak gerekir.
Sınıf final
yapım arkasındaki mantık çok ince ve genellikle gözardı edilir. Yoksa son insanların özgürce sınıf genişletmek, public
protected
davranışı geçersiz kılmak, değişken Ekle, bir vekil olarak bir alt sınıf sağlayın. Sınıf final
ilan ederek bu olmayacak emin olabilirsiniz.
Eylem sorunu görmek için aşağıdaki örneği düşünün:
public class MyApp { /** * @param args */ public static void main(String[] args) { System.out.println("Hello World!"); OhNoMutable mutable = new OhNoMutable(1, 2); ImSoImmutable immutable = mutable; /* * Ahhhh Prints out 3 just like I always wanted * and I can rely on this super immutable class * never changing. So its thread safe and perfect */ System.out.println(immutable.add()); /* Some sneak programmer changes a mutable field on the subclass */ mutable.field3=4; /* * Ahhh let me just print my immutable * reference again because I can trust it * so much. * */ System.out.println(immutable.add()); /* Why is this buggy piece of crap printing 7 and not 3 It couldn't have changed its IMMUTABLE!!!! */ } } /* This class adheres to all the principles of * good immutable classes. All the members are private final * the add() method doesn't modify any state. This class is * just a thing of beauty. Its only missing one thing * I didn't declare the class final. Let the chaos ensue */ public class ImSoImmutable { private final int field1; private final int field2; public ImSoImmutable(int field1, int field2){ this.field1 = field1; this.field2 = field2; } public int add(){ return field1 field2; } } /* This class is the problem. The problem is the overridden method add(). Because it uses a mutable member it means that I can't guarantee that all instances of ImSoImmutable are actually immutable. */ public class OhNoMutable extends ImSoImmutable { public int field3 = 0; public OhNoMutable(int field1, int field2) { super(field1, field2); } public int add(){ return super.add() field3; }
}
Uygulamada çok yaygın bir Bağımlılık Enjeksiyon ortamlarda yukarıdaki sorunla karşılaşırsanız. Açıkça bir şeyleri başlatmasını ve size verilen süper sınıf başvuru aslında bir alt sınıfı olabilir.
Bu elinden değişmezliğini tanıdı final
olarak sınıf işareti var hakkında somut garantiler yapmak. Bu derinlik Effective Java kaplı ve açık Java memory model belirtimi başvuruyor.
Nasıl bir dosyanın içeriğini bir Java ...
Nasıl Java genel bir dizi oluşturmak i...
Nasıl bir dosya oluşturmak ve Java ile...
Nasıl UML diyagramları (özellikle sıra...
Nasıl iki mutlak yol (veya URL) Java g...