c#风格的对象初始化可以在Java中使用吗?

本文关键字:Java 风格 对象 初始化 | 更新日期: 2023-09-27 18:02:05

在c#中可以这样写:

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

我可以看到数组初始化可以用类似的方式完成,但在Java中也可以完成类似的事情,如果是这样,语法是什么?

c#风格的对象初始化可以在Java中使用吗?

初始化语法在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();

Java没有使用较短语法实例化对象的内置功能。c#编译器会处理这个问题,并在IL中分离出属性设置。除非Java语言开发人员认为这很重要,否则您将无法采用此快捷方式。

创建初始化的构造函数。

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() );

是的,你可以这样做,你只需要在field1, field2 etc之前添加类型,而不是你所拥有的应该工作。它被称为Java中的匿名类