Может ли enum иметь абстрактные методы?

Может ли enum иметь абстрактные методы? Если да, то, что такое использование и дайте сценарий, который будет проиллюстрировать это использование.

43
задан Igor 14 September 2011 в 09:28
поделиться

2 ответа

Да перечисление может содержать абстрактный метод - можно использовать этот подход, если у Вас есть собственная реализация на перечислимые константы. (или можно опустить использовать абстрактный метод с использованием специализированного значения на перечислимую константу Перечисление со специализированным значением в Java)

, например ( постоянно-определенные реализации метода )

enum TrafficSignal {

    RED{
        @Override
        public void action(){
            System.out.println("STOP");
        }
    }, 
    GREEN{
        @Override
        public void action(){
            System.out.println("GO");
        }
    }, 
    ORANGE{
        @Override
        public void action(){
            System.out.println("SLOW DOWN");
        }
    };


    public abstract void action();
}

, Если эта методика характерна для всех перечислимых констант, тогда рассматривают использование интерфейса. (Перечисления Java расширяют java.lang. Перечислимый универсальный класс неявно, таким образом, Ваши перечислимые типы не могут расширить другой класс (потому что Java не поддерживает множественное наследование), но может реализовать интерфейс)

interface ColorInterface{
    void inLowerCase();
}

enum Color implements ColorInterface{

    RED, GREEN, ORANGE;

    @Override
    public void inLowerCase(){
        System.out.println(this.toString().toLowerCase());
    }
}

Использование:

public class TestEnums{

     public static void main(String []args){
        TrafficSignal signal = TrafficSignal.RED;
        signal.action();

        ColorInterface color = Color.RED;
        color.inLowerCase();
     }
}

:

STOP
red

Рассматривают шаблон перечисления стратегии, если некоторые, но не все, перечислимые константы совместно используют общие поведения. [Эффективный Java - Joshua Bloch - третий выпуск. страница 166]

0
ответ дан 26 November 2019 в 22:50
поделиться

Точно так же, как ответ @lukastymo возможно реализовать абстрактный метод в перечислении, и это предпочтено для реализации интерфейса при добавлении метода в перечислении.

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

public enum ScheduleRepeat {
  DAILY(date -> date.plusDays(1)),
  WEEKLY(date -> date.plusWeeks(1)),
  MONTHLY(date -> date.plusMonths(1)),
  QUARTERLY(date -> date.plusMonths(3)),
  BIANNUALLY(date -> date.plusMonths(6)),
  ANNUALLY(date -> date.plusYears(1)),
  ;

  private final Function<LocalDate, LocalDate> nextDateFunction; // or UnaryOperator<LocalDate>

  ScheduleRepeat(Function<LocalDate, LocalDate> nextDateFunction) {
    this.nextDateFunction = nextDateFunction;
  }

  public LocalDate calculateNextDate(LocalDate dateFrom) {
    return nextDateFunction.apply(dateFrom);
  }
}

Тогда перечисление может использоваться как:

LocalDate today = LocalDate.of(2019, 9, 18); // 2019 Sep 18
ScheduleRepeat.DAILY.calculateNextDate(today); // 2019-09-19
ScheduleRepeat.MONTHLY.calculateNextDate(today); // 2019-10-19

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

0
ответ дан 26 November 2019 в 22:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: