2017-01-23 50 views
2

道歉的垃圾標題,如果有這個問題的條款,請改變它!謝謝。Automagic給對象一個id並通過所述id引用它的方式?

如何清理我的代碼中的以下「模式」以更加自動化。通過這個我的意思是我可以創建一個擴展Foo的新對象,而不必爲該對象創建Foo的靜態字段成員並將其添加到散列表。

class Foo { 
    protected int id; 
    public Foo(int id) { this.id = id; } 

    public static final int BAR = 0; 
    public static final int QUX = 1; 
    public static HashMap<Integer, Foo> FOOS = new HashMap<>(); 
    static { 
     FOOS.put(BAR, new Bar()); 
     FOOS.put(QUX, new Qux()); 
    } 
} 

class Bar extends Foo { 
    public Bar() { this(Foo.BAR); } 
} 

class Qux extends Foo { 
    public Qux() { this(Foo.QUX); } 
} 

我的主要要求是,我可以很容易地解決每一個對象通過它的ID,即沒有神奇數字:

someArray[randomIndex] = Foo.BAR; 

但是他們仍然需要有一個整數,這樣我就可以把在一個隨機數,它可以做一個查找它所引用的對象:一個有點hackish

for (int i : someArray) { 
    // for simplicity pretend that all the values 
    // in someArray are all valid keys for the FOOS hashmap 
    System.out.println(Foo.FOOS.get(i).id); 
} 
+0

你能設計一個完美的'hashCode()'嗎? –

回答

0

,但你可以使用一個enum Foo它處理的對象和ID:

enum Foo { 
    QUX; 

    private static int idIncrementor = 0; 
    private int id; 

    Foo() { 
     this.id = idIncrementor++; 
    } 

    public int getId() { 
     return id; 
    } 
} 

然後,FooManager類,它處理的映射中嵌入它:

class FooManager { 
    private static HashMap<Integer, Foo> foos = new HashMap<>(); 

    static { 
     for(Foo foo : Foo.values()) { 
      foos.put(foo.getId(), foo); 
     } 
    } 

    public static Foo getFoo(int id) { 
     return foos.get(id); 
    } 

    //enum Foo goes here 
} 

然後,您可以添加新的枚舉,而不用擔心每次都映射它們。

要訪問一個對象,只需做FooManager.getFoo(#)。 查找對象的idFooManager.Foo.QUX.getId()

+0

太棒了,謝謝! – flooblebit