2016-10-19 3 views
1

Давайте рассмотрим перечисление.Java Enum methods - switch vs Переопределение для каждого объекта

В чем разница между созданием одного метода с помощью «switch (this)» для каждого объекта и создания одного абстрактного метода и переопределения его для каждого объекта в перечислении?

+1

Можете ли вы опубликовать код, который иллюстрирует немного больше того, что вы несете .... –

+1

Пожалуйста, прочитайте [помощь] на [какие вопросы не задавать] (https://stackoverflow.com/help/dont -просить). Здесь вы в основном просите мнения всех о про и con без реальной проблемы, которую нужно решить. –

ответ

1

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

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

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

2

Не обязательно разница, в то время как вы не изменяете перечисление. Однако, давайте рассмотрим пример:

enum MyEnum { 
    FIRST 
    { 
     @Override 
     void foo() { 
      //Do something 
     } 
    }, 
    SECOND 
    { 
     @Override 
     void foo() { 
      //Do something else 
     } 
    }; 

    abstract void foo(); 
} 

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

Давайте посмотрим на распределительном случае вместо:

enum MyEnum { 
    FIRST, 
    SECOND; 

    void foo() { 
     switch (this) { 
     case FIRST: 
      //Do something 
      break; 
     case SECOND: 
      //Do something else 
      break; 
     default: 
      break; 
     } 
    } 
} 

Если мы должны были добавить новый элемент THIRD, то мы смогли бы забыть, добавив еще один случай на заявление переключателя, то есть мы должны быть более осторожно.

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

0

Метод enum имеет то преимущество, что следует принцип открытого/закрытого. Если вам нужно развернуть перечисление, все, что вам нужно сделать, это реализовать метод для нового члена перечисления, и вы хороши; в противном случае вам нужно найти свои коды, где ваше перечисление используется для покрытия всех возможностей.

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

Я обычно использую методы enum для проблем, связанных с «основными» функциями перечисления и с использованием переключателей в другом месте.