2017-01-23 14 views
2

Извините за звание мусора, если есть срок для этой проблемы, пожалуйста, измените его! Благодарю.Автоматический способ предоставления объектов id и ссылки на него указанным идентификатором?

Как я могу очистить следующий «узор» в моем коде, чтобы быть более автоматическим. Под этим я подразумеваю, что я могу создать новый объект, который расширяет Foo без необходимости создания статического члена поля Foo для указанного объекта и добавления его в hashmap.

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; 

Но они все равно должны иметь целое число, так что я мог бы поместить в случайное число, и это может сделать поиск на объект он ссылается на:

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, который обрабатывает объекты и идентификаторы:

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(#). Чтобы найти id объекта: FooManager.Foo.QUX.getId().

+0

Удивительный, спасибо! – flooblebit