2016-02-05 61 views
3

我在Java中很基础,因为我是全职C#开发人员,但我需要在Android中创建一些私人项目。Java初始化风格类似于C#

在C#中,我可以做这样的事情:

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

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

现在,当我想用​​类测试,我可以做这样的代码:

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必须Seter和Geter到现场,我确定这个,但现在如果我想使用Test在这样的物体,像我用它在C#中,我必须这样做:

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

IMO这不是很好的和明确的声明。我知道,我可以添加构造函数,如:

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

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

而且使用它像:

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

但是,当我有更复杂的类(例如用200场(是的我有))构造函数将很长,它很难阅读它。

那么我可以用Java以其他方式初始化Java中的类吗?

感谢

回答

7

实际上,你可以在Java中使用object initializers还,但他们被称为double brace initializers。例如:

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

但是,您应该不要使用它,因为它有一些奇怪的/意想不到的副作用。此示例为TestOtherClass生成AnonymousInnerClass。您可以阅读更多关于双括号初始化程序here

如果你有更多的参数比你想传递你的构造函数,你可以使用建议的模式,如建议by this answer

+0

它看起来就是我寻找的。那些双大括号会吓到我一点,因为大括号可以使得发现bug更加糟糕,特别是在某些函数中初始化对象的时候:)但是这对我来说看起来很完美。它比我在帖子中显示的方法花费更少的资源? – Aht

+1

它需要更多的资源 - 像这样创建的每个对象都有自己的类。 –

+1

这实际上是滥用匿名内部类 - 被真正真正想让Java看起来像C#的人深受欢迎。 –