2015-04-29 114 views
4

創建對象時,我們可以在constructor中聲明並初始化對象變量嗎?Java - 我們可以在構造函數中聲明對象變量嗎?

我正在創建一個基於XML的對象。 XML格式是以前系統的輸出並且是動態的。

因此對象變量是基於元素的。如果我在構造函數中聲明變量會更好。

在下面的代碼中,我們可以聲明temp作爲對象變量。

例如:

public class A 
{ 
    public A() 
    { 
     HashMap<String, Object> temp = new HashMap<String, Object>; 
    } 
} 

我找不到這種意識形態的任何示例代碼。
有什麼建議嗎?

+0

如果在body或構造函數或{}中聲明變量,則僅在該範圍內可見。 如果你想創建對象/類成員,你必須在類作用域中聲明它。 –

回答

0

我認爲你正在尋找一些有點不同的東西。

public class A { 
    // Constructor 
    private A() { 
    } 

    public static A createObjectA(...) { 
     A result = new A(); 
     // In here transform the XML in a suitable format and set it into the result object. 
     // Return the result 
     return result; 
    } 
} 

讓我們來看看上面的代碼。你有一個可以在類中調用的構造函數,所以你確定沒有人會以不好的方式使用它。

然後,你必須提供你對象A的實例的靜態功能,您將收到通過這個創建A的每一個實例:

A newObj = A.createObjectA(...); 

您可以添加儘可能多的靜態函數來分配對象匹配您擁有的各種輸入格式的數量,這種方法的優點是您的結果對象將無需解析先前輸入的邏輯。

Ofc你可以把靜態函數放在另一個類中,但是你必須使構造函數可調用(你通常用C++中的朋友函數做什麼)。

+0

謝謝Mike,實施這種方法。 –

1

如果在構造函數中聲明它,它將在構造函數中是局部的,這意味着它不會非常有用。但是,如果只需要在構造函數中使用此變量,就可以這樣做。

1

你可以聲明裏面的構造變化,但其範圍將被限制在constructor.Instead你可以做

public class A 
{ 
    HashMap<String, Object> temp; 
    public A() 
    { 
     temp = new HashMap<String, Object>; 
    } 
} 

聲明它的構造函數外,並通過這個初始化它的內部構造也可以是在任何方法訪問因爲它的範圍現在是全球性的。

1

是的,你可以。

但是可見性的範圍將只在構造函數。

您可以訪問temp只進構造函數(僅{}):

public class A { 

    public A() { 
     Map<String, Object> temp = new HashMap<String, Object>;   
    } // end scope of visibility for `temp` 

它不會,如果你以後要使用該地圖(對於對象等)的最佳解決方案。

但是,如果你只需要在構造函數中使用它,那很好。

如果你使用構造之外本地圖:

public class A { 

    Map<String, Object> temp; 

    public A() { 
     temp = new HashMap<String, Object>;   
    } 
    // you can use it here 

BTW
良好做法是使用界面參考:

地圖TEMP =新的HashMap;代替

HashMap中臨時=新的HashMap;

更多資訊:Type List vs type ArrayList in Java

+0

謝謝Nazar –

0

構造像的代碼的任何其它塊(例如,一個方法或匿名塊)。你可以在那裏聲明你想要的任何變量,但它的作用域將僅限於構造函數本身。

聽起來好像你需要聲明一些集合或映射爲數據成員並讓構造函數動態地填充它的值。

相關問題