2014-11-16 2 views
1

Я промежуточный Java-программист, который столкнулся с головоломкой.статические экземпляры против enums

Я пытаюсь решить, какую стратегию использовать при использовании фиксированных параметров в определенных методах.

например. Я хочу это сделать:

void aMethod (int i, Color color) 

где Цвет - это мое собственное творение.

Они, как я вижу, я могу либо создать цвет перечисления. Я знаю, как это сделать.

Я также могу это сделать:

public class Color{ 

public static Color blue = new Color(23, 22, 21); 
public static Color red = new Color(12, 32 ,10); 

private int a; 
private int b; 
private int c; 

private Color(int a, int b, int c){ 
this.a = a; 
this.b = b; 
this.c = c; 
} 

methods... 

Дело в том, что после попытки как я могу сделать то же самое с ними. Единственное отличие состоит в том, что я чувствую, что мой пример класса более понятен, я точно знаю, что он делает. Несмотря на то, что я могу написать многофункциональное перечисление, я не совсем уверен, какие переменные являются статическими, общедоступными, частными и т. Д., А также то, какую память он будет использовать. Это немного грязно.

Итак, мой вопрос к вам: я должен идти с классами, как выше, вместо перечислений? Есть ли некоторые вещи, которые я не знаю, которые могут добавить к делу Эннумов?

+0

Вы можете легко и быстро перебирать перечисления, но не по статическим константам. –

+0

Возможный дубликат [В чем преимущество переименования Java в сравнении с классом с общедоступными статическими конечными полями?] (Http://stackoverflow.com/questions/9969690/whats-the-advantage-of-a-java-enum-versus -a-class-with-public-static-final-fiel) –

ответ

1

Использование Enum, когда:

  • Предустановленные список значений (объектов)
  • не может использовать значение, которого нет в списке предопределенный список значений (может быть подтвержден - безопасный тип)
  • JVM создает только фиксированное количество экземпляров объекта для значений Enum.

Использование статических, когда:

  • Список значений (объектов), могут быть использованы не Fixed
  • считается не безопасным методом, так как параметр метода может быть передан любым экземпляром класс.

Ваш случай:

  • Если вы хотите ЛИМИТЕД/Validate цвета, что Caller можно перейти к функции 'aMethod' - Использование ENUM
  • Если вы хотите Caller может передать любой экземпляр Color to 'aMethod' --- Использовать статическое определение
1

В вашем методе

void aMethod (int i, Color color) 

при использовании перечисления в качестве ваших параметров. Вы можете использовать только цвет, который вы определили в перечислениях. Однако, если вы используете статические экземпляры, вы не можете гарантировать, что этот параметр является цветом экземпляра в вашем классе Color. Фактически, любые переменные, которые являются цветом, могут быть преобразованы в этот метод.

И перечисление целое в памяти на самом деле, использование enum может сэкономить время, потраченное, я думаю.

0

Если возможно (у вас есть ограниченные значения и вы не хотите создавать динамически созданные значения), я всегда хотел бы перечислить.

  • Вы эффективно предотвратить плохой вход (см https://stackoverflow.com/a/9254703/1606867)
  • Enumy предоставляет несколько дополнительных функций:
    • Вы можете перебрать перечисление:
      for(ColorEnum enumEntry : ColorEnum.values()) //do something with enumEntry
    • Вы можете использовать перечисления в SWITCH/случаях :
      ColorEnum ce; // with some value of course switch (ce) { case blue: break; case red: break; default: break; }
    • Вы можете использовать перечисления, например комбинированные поля, списки и т. д.в графическом интерфейсе:
      new JComboBox<>(ColorEnum.values());
+0

Любые комментарии к нисходящей линии? –

+0

В нисходящей версии сказано, что вы всегда будете использовать перечисление без каких-либо ограничений. ... удалил его после редактирования. –

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