Должен ли я передать перечисление в качестве параметра или передать его буквальное значение - PullRequest
5 голосов
/ 12 июня 2011

При разработке некоторых интерфейсов и классов я размышлял о том, должен ли я передавать enum в качестве параметра или его буквальное значение.

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

У кого-нибудь есть какое-либо мнение по этому поводу?:)

public enum Item{
CANDY("candy"), APPLE("apple");
}
  1. Передача enum

    public buy(Item item){}
    
  2. Передача по буквальному значению

    public buy(String itemValue){}
    

Приветствия.

Ответы [ 4 ]

6 голосов
/ 12 июня 2011

Определенно пройти мимо enum.Мои причины:

  1. В реализации buy будет гораздо проще работать с объектом enum, а не со строкой.Например, если вам нужно сделать переключатель и т. Д.
  2. Намного лучше в обслуживании.Вы можете легко увидеть, нарушаете ли вы что-либо, если вы изменяете строковое представление или доступные значения перечисления, в то время как его не так легко увидеть, если его преобразовать в String.
  3. . При рассмотрении реализацииbuy позже вы легко сможете увидеть, как обрабатываются различные значения перечисления.Когда вы передаете его как String, вы можете не знать, глядя на метод, каковы все возможные входные значения и как они обрабатываются.
6 голосов
/ 12 июня 2011

Я бы рекомендовал передать значение enum, поскольку оно более строго набрано. В вашем примере, если «candy» и «apple» являются единственными допустимыми аргументами для метода «buy», вы можете применить это во время компиляции, указав в качестве аргумента метода перечисление, а не String.

3 голосов
/ 12 июня 2011

В большинстве случаев я бы передавал фактический тип Enum (Item в этом примере), а не строковое представление. Это обеспечивает правильную печать и является целью Enums.

Одна из ситуаций, когда вам может потребоваться передать строковое представление (полученное из Enum.name()), связана с проблемами сериализации / управления версиями.

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

0 голосов
/ 12 июня 2011

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

Попробуйте этот пример:

public class ItemDemo {

public enum Item { 
    CANDY("candy"), APPLE("apple"); 
   }

CANDY c;
APPLE a;

public ItemDemo(String name, int age, double money, CANDY c, APPLE a) {
       this.c= c;
       this.a= a;
     }
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...