Object Initializer

Object Initializer به شما اجازه می دهند خاصیت ها را در داخل کلاس مقداردهی کنید. اگر به عنوان مثال چندین خاصیت داشته باشید و نخواهید که یک سازنده را جهت مقداردهی به آنها تعریف کنید، می توانید از object initializer استفاده نمایید. به عنوان مثال به کد زیر توجه کنید :

class Sample
{
    public int     Property1;
    public String  Property2;
    public boolean Property3;
}

public class MyFirstProgram
{
    public static void main(String[] args)
    {
        Sample sampleClass = new Sample();

        sampleClass.Property1 = 100;
        sampleClass.Property2 = "Sample";
        sampleClass.Property3 = true;
    }
}

همانطور که مشاهده می کنید، لازم است که مقادیر را تک به تک به خاصیت ها اختصاص دهیم. با استفاده از object initializers می توان کد را ساده تر کرد :

class Sample
{
    public int     Property1;
    public String  Property2;
    public boolean Property3;
}

public class MyFirstProgram
{
    public static void main(String[] args)
    {
        Sample sampleClass = new Sample()
        {{
            Property1 = 100;
            Property2 = "Hello";
            Property3 = true;
        }};        
    }
}

مشاهده می کنید که بعد از ایجاد یک شی از کلاس به جای پرانتز از دو آکولاد ( }} ) استفاده کرده و سپس با لیست کردن خاصیت ها مقادیری را که لازم داریم به آنها اختصاص می دهیم. به این نکته نیز توجه کنید که خواص به وسیله سمیکالن (;) از هم جدا می شوند. هنگام استفاده از object initializers سازنده پیشفرض بدون پارامتر قبل از هر خاصیت مقداردهی شده فراخوانی می شود. از آنجاییکه سازنده پیشفرض قبل از اختصاص مقادیر به خاصیت ها اجرا می شود، می توانید مقادیری پیشفرضی به هر یک از خواص اختصاص بدهید، با این کار لازم نیست که حتما به همه خواص با استفاده از initializer مقدار اختصاص داده شود. اگر یک سازنده غیر پیشفرض (non-default constructor) به کلاس اضافه کنید باز هم باید یک سازنده بدون پارامتر پیشفرض برای قدرت استفاده از object initializers وجود داشته باشد. می توان از object initializers تو در تو نیز استفاده نمود. فرض کنید کلاس Sample مان یک خاصیت از نوع Animal که دارای دو خاصیت Name و Age هست را دارا می باشد :

class Animal
{
    public String Name;
    public int    Age;
}

class Sample
{
    public int     Property1;
    public String  Property2;
    public boolean Property3;
    public Animal  Property4;
}

public class MyFirstProgram
{
    public static void main(String[] args)
    {
        Sample sampleClass = new Sample()
        {{
            Property1 = 100;
            Property2 = "Hello";
            Property3 = true;
            Property4 = new Animal()
            {{                      
                Name = "Kitty";     
                Age = 3;            
            }};                     
        }}; 
    }
}

نوع دیگر از مقداردهنده ها collection initializers می باشند، که در کلکسیون های عمومی (generic) استفاده می شوند :

   1: import java.util.List;
   2: import java.util.ArrayList;
   3: import java.text.MessageFormat;
   4: 
   5: class Person
   6: {
   7:     public String FirstName;
   8: 
   9:     public Person(String f)
  10:     {
  11:         this.FirstName = f;
  12:     }
  13: }
  14: 
  15: public class MyFirstProgram
  16: {
  17:     public static void main(String[] args)
  18:     {
  19:         List<Person> people = new ArrayList<Person>()
  20:         {{                                           
  21:             add(new Person("John"));                 
  22:             add(new Person("Jenny"));                
  23:             add(new Person("Joe"));                  
  24:         }};                                          
  25:         
  26:         for (Person person : people)
  27:         {
  28:             System.out.println(MessageFormat.format("{0}", person.FirstName));
  29:         }
  30:     }
  31: }
John
Jenny
Joe