2012-05-10 3 views
1

Я большое перечисление заявило в своем классеперечисление как место хранения?

public enum CarMaker{ 
     Honda, 
     Toyota, 
     Sony, 
     ...; 

     public CarMaker at(int index){ //a method to retrieve enum by index 
       CarMaker[] retval = this.values(); 
       return retval[index]; 
     } 
     public final SomeObj val; //a value associated with each enum 
      //.. more custom functions if needed 
    } 

, так как только один экземпляр каждого Автоконцерна требуется, это плохая практика, если я хочу использовать это перечисление в качестве хранилища (как массив, но вместо доступа каждый элемент с помощью индексов, я мог бы использовать более интуитивно понятные имена. Также я могу иметь собственные функции для каждого элемента)

CarMaker A = CarMaker.Honda; 
CarMaker B = CarMaker.at(1); 
//Error above b/c 'at' is not a static member, can I make at a static member? 

A.val = 5; 
B.val = 6; 
//Here I want A to be share data with B since both are "Honda" 
//but it doesn't seem to do that yet 
System.out.println(A) 
System.out.println(B) 

//Expected output: 
//A: 6 
//B: 6 

Сейчас а и в, кажется, чтобы создать свой собственный экземпляр «Хонда», но я хочу, чтобы они быть разделенным. Является ли это возможным?

+3

Sony делают автомобили? –

+1

упс ... но вы поняли мою идею. : P – Bonk

+0

У перечислений нет отдельных экземпляров, поэтому я не вижу, как у вас возникли проблемы. A и B должны быть одним и тем же объектом. –

ответ

2

Используйте перечисление, но через композицию: создайте перечисление фирменных наименований, а затем создайте свои объекты, которым нужно имя, чтобы удерживать поле перечисления.

Пример

public enum CarMaker { 
    Honda, 
    Toyota, 
    Sony, 
    Olympus, 
    Facebook, 
    Google, 
    ... 
} 

public class Car { 
    CarMaker carMaker; 
    //... etc.... 

    Car(CarMaker carMaker) { 
     this.carMaker = carMaker; 
     // ... more code 
    } 

    //.... 
+0

Спасибо за быстрый ответ, не возражаете ли вы дать мне быстрый пример? – Bonk

+0

@YonkShi: например. –

+0

@YonkShi: Я не уверен, что вы подразумеваете под «это плохая практика, если я хочу использовать это перечисление в качестве хранилища (например, массив, но вместо этого обращаюсь к каждому элементу с использованием индексов, я мог бы использовать более интуитивные имена», но возможно, вы смотрите на использование EnumMap? –

5

enum s должны быть неизменными константами. Предоставление им публичного, изменяемого поля - это ужасная идея.

+0

............. Аминь! –

+0

Это то, что я тоже думал, но я не могу придумать другие способы назначения интуитивных имен группе пользовательских объектов. Слишком плохо, я не могу перегрузить [] оператор в java. В противном случае я бы полностью перерезал перечислить. – Bonk

+0

@YonkShi * назначает интуитивные имена группе настраиваемых объектов * что вы имеете в виду? – Jeffrey

Смежные вопросы