2014-11-13 69 views
3

我是一名新程序員,試圖找到一些最佳實踐。我正在用一種方法編寫一個簡單的類。它需要很長的時間並且返回一個int(代表一個內存量),取決於這個長度有多大。這是單身人士的好用嗎?

我打算想要這些內存模型中的一個以上,並且它看起來每個人都應該是一個單獨的Singleton。這是Singleton模式的合理使用嗎?我不需要需要只有一個實例存在,但它似乎是這種類在概念上是一個單身人士。這是一個單身人士的好理由嗎?或者是否有意義添加一個私有構造函數並使該方法爲靜態?或者我是否過度整個事情?代碼是這樣的:

public class MemoryModel implements SomeInterface { 

    public int get(Long links) { 

     final int result; 

     if (links < 700_000) { 
      result = 50_000; 
     } else { 
      result = 140_000; 
     } 

     return result; 
    } 
} 

編輯:如果我理解每個人的答案是正確的,答案是否定的。我不想要這個類的一個實例 - 沒有理由永遠實例化它。我應該讓這個方法是靜態的,永遠不需要實例化。

我還從單反模式被過度使用的答案和鏈接中感覺到,並且可能會產生問題,因爲它會創建一個全局實體。只有在有充分理由要求只存在一個實例的情況下,才應該使用單身。

+2

建議閱讀:http://jalf.dk/blog/2010/03/singletons-solving-problems-you-didnt-know-you-never-had-since-1995/ –

+1

爲什麼需要一個Long '而不是'長'?你不測試'null'這意味着如果'links'爲null,你將在'if'語句的行上得到一個NullPointerException。 –

+0

在實際的代碼中,我測試了null。我只是拿出所有非必要的代碼,所以這個想法很清楚。 – csjacobs24

回答

2

你應該讓靜態...

首先,你必須在類中沒有一個安韋單身。單例是一個保證你只能創建它的一個實例的類。

其次,沒有理由提到爲什麼你需要一個實例。你會希望一個實例預先保存一個對象的狀態。你在那裏擁有的對象沒有狀態(沒有字段=沒有狀態),只有一個方法 - 因此它可以是靜態的。

+0

謝謝!這是完全合理的。 – csjacobs24

4

當你想要在多個地方引用相同的類而不創建該類的新對象時,可以使用單例類。

在你給它的例子看起來應該是在公共靜態方法中,因爲它與類的實例沒有任何關係。

單身人士和實用職業有什麼不同請在link上閱讀。

+0

感謝您的鏈接,我不熟悉「靜態工具類」的行話。有用的想法,我會實現它,因爲我沒有理由實例化。 – csjacobs24

1

這不是你在這裏的單例模式。你只是在課堂上有一種方法。

也許你可以先讀到這裏,然後再次嘗試推行單:

Singleton Pattern

+0

我知道這不是一個單身人士。我想知道這是否適合使用這種模式。我現在確信它不是。 – csjacobs24

1

僅僅因爲你只需要一個東西的實例並不意味着你應該讓它成爲一個單例。如果你能避免它,不要這樣做。

您的目標是隻撥打new MemoryModel()一次。你的問題是你需要一種方法來從不同的地方引用該對象。

但是,最好的選擇是簡單地將引用傳遞給該對象。這解決了單身問題:他們提供的全球static參考。

static final Object singleton = new Object(); 
static void doStuffBad() { 
    // bad.. hardcoded reference & also global state 
    System.out.println(singleton); 
} 

static void doStuffGood(Object reference) { 
    // good, this does not create any bad dependencies etc. 
    System.out.println(reference); 
} 

public static void main(String[] args) { 
    doStuffBad(); 
    doStuffGood(new Object()); 
} 

有這樣的情況:傳遞引用周圍變得愚蠢。所以像String.CASE_INSENSITIVE_ORDER(一個Comparator)一些單身人士是有道理的。它實際上也可能對你的情況有意義。這實際上取決於你想要實現什麼,以及爲什麼你想要創建一個單例。你不應該如果你想要一個,因爲你需要在不同的地方訪問對象,你的對象層次結構如此混亂,以至於傳遞引用太痛苦了。

1

這是一個靜態功能。

辛格爾頓它是一種創造型模式。它不僅具有唯一的實例,還封裝了創建算法。

使用單例,如果使用重複使用內存的單例,有一個靜態方法,以及一個指向堆上實例的靜態變量是沒有意義的。但是對於靜態方法,你只有一個靜態方法,堆中沒有任何東西(並且在java中使用更少的堆更好)。