Java如何像C#那样初始化类?

5

我是一名全职C#开发人员,对Java基础不够扎实。但是我需要在Android上做一些私人项目。

在C#中,我可以做出如下操作:

public class Test
{
    public string A {get;set;}
    public OtherClass B {get;set;}
}

public OtherClass ()
{
    string Some {get;set;}
    string Again {get;set;}
}

现在,当我想使用test类时,可以编写以下代码:
var test = new Test
{
    A = "test",
    B = new OtherClass
    {
        Some = "Some",
        Again = "Again"
    }
};

感谢这个,现在我已经清晰地初始化了测试。

当我想在Java中做到这一点时,我必须编写如下代码:

public class Test
{
    private string A;
    public string GetA()
    {
        return A;
    }
    public void SetA(string a)
    {
        A = a;
    }

    privte  OtherClass B;
    public OtherClass GetB()
    {
        return B;
    }
    public void SetB(OtherClass b)
    {
        B = b;
    }
}



public class OtherClass
{
    private string Some;
    public string GetSome()
    {
        return Some;
    }
    public void SetSome(string some)
    {
        Some = some;
    }

    privte  string Again;
    public string GetAgain()
    {
        return Again;
    }
    public void SetAgain(string again)
    {
        Again = again;
    }
}

我知道Java必须有Setter和Getter来访问字段,我对此没有异议,但是现在如果我想像在C#中那样使用Test对象,我必须做一些类似这样的事情:

OtherClass otherClass = new OtherClass();
otherClass.SetSome("Some");
otherClass.SetAnothier("Another");
Test test = new Test();
test.SetA("A")
test.SetB(otherClass);

我认为这并不是一个清晰易懂的声明。我知道可以添加类似以下构造函数:

public Test(string a, otherClass b)
{
    A = a;
    B = b;
}

and

public OtherClass(string some,string another)
{
     Some = some;
     Another = another;
}

然后像这样使用:

Test test = new Test("Test",new OtherClass("some","Another"));

但是当我有更复杂的类(例如带有200个字段(是的,我有那些))时,构造函数会变得非常长,并且很难阅读。

那么我能以其他方式在Java中初始化类吗?

谢谢

1个回答

10

实际上,在Java中也可以使用对象初始化器,但是它们被称为双括号初始化器。例如:

Test test = new Test()
{{
    SetA("test");
    SetB(new OtherClass()
    {{
        SetSome("Some");
        SetAgain("Again");
    }});
}};

然而,你可能不应该使用这种方法,因为它会产生一些奇怪/意外的副作用。这个例子为TestOtherClass生成了一个AnonymousInnerClass。你可以在这里阅读更多关于双重大括号初始化的内容
如果你有比构造函数更多的参数需要传递,你可以使用建造者模式,就像这个答案所建议的那样。

看起来这就是我要找的。双括号让我有点害怕,因为太多的括号可能会使查找错误变得更糟糕,特别是当在某个函数中初始化对象时 :) 但这对我来说看起来完美。它所占用的资源比我在帖子中展示的方法少吗? - Aht
1
这需要更多的资源 - 每个你创建的对象都有自己的类。 - Pete Kirkham
1
这实际上是对匿名内部类的误用 - 这种误用被那些非常希望Java看起来像C#的人所流行。 - Dave Doknjas
1
@Aht:主要关注点不应该是外观问题,而应该是“代码是否完成了需要完成的任务”——在这种情况下,存在一个没有必要发生的隐藏类实例化。 - Dave Doknjas
@DaveDoknjas:所以我会记住这个解决方案,但我会尽量避免它。 - Aht

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接