在C#中可以写:
MyClass obj = new MyClass()
{
field1 = "hello",
field2 = "world",
field3 = new MyOtherClass()
{
etc....
}
}
我可以看到数组初始化可以用类似的方式完成,但是类似于上面的东西也可以在Java中完成,如果是这样,那么语法是什么?
答案 0 :(得分:37)
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();
答案 1 :(得分:2)
Java没有内置的功能来使用较短的语法实例化对象。 C#编译器处理它并分离出IL中的属性设置器。在Java语言开发人员认为这很重要之前,您将无法使用此快捷方式。
答案 2 :(得分:2)
只需为初始化创建构造函数。
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() );
答案 3 :(得分:-2)
是的,你可以这样做,你只需要在field1, field2 etc
之前添加类型,而不是你应该有的工作。它在Java中被称为匿名类。