2016-07-11 23 views
-2

我看到一些一段代碼看起來像每個對象的靜態或新實例?

public class A { 

public void doSomething(B b) { 
    b.addSometing("queue1", getDefault()); 
    b.addSometing("queue2", getDefault()); 
    b.addSometing("queue3", getDefault()); 
} 

private C getDefault() { 
    C c = new C(); 
    c.setAutoCreate(true); 
    c.setExired(false); 
    c.setDelay(3500); 

    return c; 
}} 

如果我們把C c變種。 (對於類A的所有對象是默認的),對於類A的每個對象,我們只是使用大量內存來處理類A的大對象,也許最好使C c靜態?我們將只爲整個班級創建C班的一個實例,並將其用於班級A的每個對象。如果我們這樣做,該代碼後會喜歡像

public class A { 
private static C c = new C(); 

static { 
    c.setAutoCreate(true); 
    c.setExired(false); 
    c.setDelay(3500); 
} 

public void doSomething(B b) { 
    b.addSometing("queue1", c); 
    b.addSometing("queue2", c); 
    b.addSometing("queue3", c); 
} 

}

我認爲這是更好的辦法,也許我錯了。請給我建議。

+0

最後一個doesn't做出多大意義對我來說,如果添加C'的'同一個實例的地圖不同的密鑰,爲什麼要考慮一個'Map'中去當你只有一個值爲多個鍵時,第一個地方? – SomeJavaGuy

+3

如果你使用默認的靜態實例,它應該是_immutable_,否則你可能會產生副作用。 'setAutocreate(true)'雖然看起來不可變。 – Thomas

+0

如果您對'隊列1'中的c對象進行了任何更改,那麼'隊列2'和'隊列3'中的對象也會更改。如果這是可以接受的,那麼你的靜態解決方案就好了。 – Jeet

回答

2

該問題的答案取決於應用程序的邏輯和/或A應該如何處理C實例。如果只需要一個特定對象的實例,我會建議在Java https://en.wikipedia.org/wiki/Singleton_pattern中使用Singleton模式。然而,如果類A的一個實例正在改變它的C成員,那麼使用上述方法是一個壞主意,因爲通過改變一個A對象上的C成員,你可能會干涉用另一個對象完成。

如果C成員包含所有對象使用的配置選項或數據(如上例所示),因此不會更改,您可以使用單例模式使所有對象都可訪問實例 - 在我看來,這很好。

最佳, 朱利安

相關問題