2015-02-11 68 views
0

如何確保每個類的實例都具有特定參數的唯一值? 例如: public Foo(int value);對於Foo的每個實例, 的值應該不同。否則,它可能會拋出異常。如何在Java中創建唯一的特定參數

+1

您可以發佈您的代碼嗎?你到目前爲止做了什麼? – 2015-02-11 11:20:27

+1

您可以將值存儲在Set中,並檢查它是否不在。但是你的問題聞起來像一個設計缺陷,海事組織。 – 2015-02-11 11:20:58

回答

3

你想分配這個值,還是隻是想確認你有某種ID?

爲ID的最小的解決辦法是使用靜態字段作爲計數器:

public class Foo { 

    private static int counter = 1; 
    private int id; 

    public Foo() { 
    id = counter++; 
    } 
} 

要檢查分配值,您可能想使用某種FooFactory的:

public class FooFactory { 

    private static Set<int> ids = new Set<int>(); 

    public static Foo createFoo(int value) { 
    if (ids.contains(value)) { 
     throw new FooAlreadyExistsException(); 
    } 

    ids.add(value); 
    return new Foo(value); 
    } 
} 

或者,正如其他意見所示,您可以在Foo構造函數中執行此操作:

public class Foo { 

    private static Set<int> ids = new Set<int>(); 

    public Foo(int value) { 
    if (ids.contains(value)) { 
     throw new FooAlreadyExistsException(); 
    } 

    ids.add(value); 
    } 
} 
1

假設Foo的所有實例都在內存中,您可以在Foo類中維護一個靜態Set,它將保存已使用的值。您可以在任何時候創建新實例時檢查此Set。假設對這個值沒有功能意義,另一種方法是創建一些序列(由數據庫或文件支持),每次創建新實例時都會增加一個序列,並且每個新實例的值將是該序列的當前值。

+0

您或者需要'Set '或者'Map ',否則無法快速查找。另請注意,此解決方案會造成內存泄漏。 – 2015-02-11 11:23:19

+0

@AaronDigulla我建議一個Set。我不認爲地圖是必要的。 – Eran 2015-02-11 11:24:45

+0

但是,如果重複出現,那麼該怎麼辦?它是創建對象嗎?如果我不想創建對象然後。 – 2015-02-11 11:25:11

0

我建議在一個類內部有一個靜態的ArrayList,它包含了你的對象列表。但這是不好的設計恕我直言。

1

我認爲你的獨特的價值不應該是一個參數(這是一個任意調用者的控制下),而是Foo的責任。

簡單的解決辦法是使用它的每個實例被創建時增加一個靜態字段:

private static int instanceCounter; 

// instance initializer 
{ 
    instanceCounter++; 
} 

正如其他人提到這個氣味的問題在你的設計或您的要求的理解。

請分享您迄今爲止創建的需求,您的預期設計和代碼。

編輯:'亞倫Digulla'有一個更好的建議,創建一個工廠,管理對象生命週期的這方面。

3

創建一個工廠:

public Foo createFoo(int value) {....} 

在工廠代碼,你可以保持一組的「分配」值。這使您可以優化代碼;例如,如果值是連續的,則BitSet可能比Set<Integer>更好。請注意,如果您希望能夠重用值,則必須以某種方式「釋放」您的Foo實例。

如果您只是Foo的GC實例,則該值仍將「正在使用」,除非您以某種方式通知工廠。

+0

到目前爲止,這是IMO的最佳建議。 – 2015-02-11 11:27:20

+0

爲最佳答案+1投票! – 2015-02-11 11:34:59

相關問題