SORU
10 HAZİRAN 2011, Cuma


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
10 HAZİRAN 2011, Cuma


Aşağıdazorbir değişmez gereksinimleri nesne.

  1. Sınıf final yapmak
  2. tüm üyeler son olun, onları ayarlayın açıkça, yapıcı bir statik blok, veya
  3. Bütün üyelerine özel
  4. Durumu değiştiren hiçbir Yöntem
  5. Ü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 yani private final Date imStillMutable). Bu durumda defensive 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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Andrew_Huang

    Andrew_Huang

    10 ŞUBAT 2006
  • Facebook Developers

    Facebook Dev

    24 ŞUBAT 2009
  • PomplamooseMusic

    PomplamooseM

    28 HAZİRAN 2008