Может ли инициализация объекта в стиле C # использоваться в Java? - PullRequest
26 голосов
/ 12 июля 2011

В C # можно написать:

MyClass obj = new MyClass()
{
    field1 = "hello",
    field2 = "world",
    field3 = new MyOtherClass()
    {
        etc....
    }
}

Я вижу, что инициализация массива может быть выполнена аналогичным образом, но может ли что-то подобное вышеописанному быть сделано и в Java, и если да,синтаксис?

Ответы [ 4 ]

37 голосов
/ 12 июля 2011

Этот синтаксис инициализации отсутствует в Java.

Аналогичный подход заключается в использовании инициализации с двойной скобкой, когда вы создаете анонимный внутренний подкласс с блоком инициализатора:

MyClass obj = new MyClass() {{
  // in Java these would be more like this: setFieldX(value);
  field1 = "hello";
  field2 = "world";
  field3 = new MyOtherClass() ...
}};

Имейте в виду, что на самом деле вы создаете подкласс .

Другой подход - создать компоновщик для MyClass и иметь такой код:

MyClass obj = new MyClassBuilder().
  withField1("hello").
  withField2("world").
  withField3(new MyOtherClass()).
  build();
2 голосов
/ 05 июня 2013

Просто создайте конструкторы для инициализации.

MyClass obj = new MyClass()
{
    field1 = "hello",
    field2 = "world",
    field3 = new MyOtherClass()
    {
        etc....
    }

    public MyClass()
    {
        initialize();
    }

    public MyClass(String field1)
    {
        this.field1 = field1;
        this();
    }

    public MyClass(String field, Boolean isField1)
    {
        if (isField1)
            this( field );
        else
            this.field2 = field;

        this();
    }

    public MyClass(String field1, String field2)
    {
        this.field2 = field2;
        this(field1);
    }

    public MyClass(MyOtherClass field3)
    {
        this.field3 = field3;
    }

    public MyClass(String field1, String field2, MyOtherClass field3)
    {
        this(field3);
        this(field1, field2);
    }

    private void initialize(){
        // Do any class bootstrapping here.
    }
}

// Then you have several ways to create an object instance, with initialization
MyClass myClass1 = new MyClass();
MyClass myClass2 = new MyClass( "Field 1 Value" );
MyClass myClass3 = new MyClass( "Field 1 Value", true );
MyClass myClass4 = new MyClass( "Field 2 Value", false );
MyClass myClass5 = new MyClass( "Field 1 Value", "Field 2 Value" );
MyClass myClass6 = new MyClass( "Field 1 Value", "Field 2 Value", new MyOtherClass() );
MyClass myClass7 = new MyClass( new MyOtherClass() );
2 голосов
/ 12 июля 2011

Java не имеет встроенной возможности для создания объекта с использованием более короткого синтаксиса. Компилятор C # обрабатывает это и выделяет установщики свойств в IL. Пока разработчики Java не решат, что это важно, вы не сможете использовать этот ярлык.

0 голосов
/ 12 июля 2011

Да, вы можете сделать это, вам просто нужно добавить типы до field1, field2 etc, кроме того, что у вас должно работать. Он известен как анонимный класс в Java.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...