2016-02-05 50 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#的人深受歡迎。 –