Можно ли инициализировать объект стиля С# в Java?
В С# можно написать:
MyClass obj = new MyClass()
{
field1 = "hello",
field2 = "world",
field3 = new MyOtherClass()
{
etc....
}
}
Я вижу, что инициализация массива может быть выполнена аналогичным образом, но может ли что-то подобное выше быть сделано в Java тоже, и если да, то какой синтаксис?
Ответы
Ответ 1
Этот синтаксис инициализации отсутствует в 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
Java не имеет встроенной возможности для создания объекта с использованием более короткого синтаксиса. Компилятор С# обрабатывает это и отделяет средства определения свойств в IL. Пока разработчики Java langauge не решат, что это важно, вы не сможете воспользоваться этим ярлыком.
Ответ 3
Просто создайте конструкторы для инициализации.
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() );
Ответ 4
Да, вы можете это сделать, вам просто нужно добавить типы до field1, field2 etc
, кроме того, что вы должны работать. Его называют анонимным классом в Java.