Java 枚举可以有抽象方法吗?

Java 枚举可以有抽象方法吗?,java,enums,abstract,Java,Enums,Abstract,枚举可以有抽象方法吗?如果是这样的话,有什么用,并给出一个场景来说明这种用法。是的,您可以在枚举声明中定义抽象方法当且仅当所有枚举值都有自定义的类主体和这些方法的实现(即,没有具体的枚举值可能缺少实现) 是的,但您可能更喜欢实现接口的enum。我觉得它看起来好多了。这是抽象方法的示例: public enum Animal { CAT { public String makeNoise() { return "MEOW!"; } }, DOG {

枚举可以有抽象方法吗?如果是这样的话,有什么用,并给出一个场景来说明这种用法。

是的,您可以在
枚举
声明中定义
抽象
方法当且仅当所有枚举值都有自定义的类主体和这些方法的实现(即,没有具体的枚举值可能缺少实现)


是的,但您可能更喜欢实现接口的enum。我觉得它看起来好多了。这是抽象方法的示例:

public enum Animal {
    CAT {
        public String makeNoise() { return "MEOW!"; }
    },
    DOG {
        public String makeNoise() { return "WOOF!"; }
    };

    public abstract String makeNoise();
}

是的,枚举可以包含抽象方法-如果您有自己的每个枚举常量的实现,则可以使用这种方法。(也可以省略使用抽象方法和使用自定义的每个枚举常量值)

例如(常数特定的方法实现)

如果这个方法对于所有枚举常量都是通用的,那么考虑使用接口。(Java枚举隐式扩展Java.lang.Enum泛型类,因此您的枚举类型不能扩展另一个类(因为Java不支持多重继承),但可以实现接口)

用法:

public class TestEnums{

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

        ColorInterface color = Color.RED;
        color.inLowerCase();
     }
}
输出:


如果某些(但不是全部)枚举常量共享公共行为,请考虑策略枚举模式。[有效的Java-Joshua Bloch-第三版。第166页]

就像@lukastymo的回答一样,可以在enum中实现抽象方法,在enum中添加方法时最好实现接口

在Java8和更高版本中,您可以使用lambda在一个枚举中为较小的代码实现方法。通过公开运行给定lambda的公共方法,可以在枚举外部执行这些lambda

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);
  }
}

这并不完全是从枚举本身或接口实现抽象方法,但我认为这种使用lambda添加方法的方法看起来很干净。

使用哪种语言?这听起来像是一个家庭作业,如果是这样,请使用家庭作业标记Java。我从未将枚举与抽象方法一起使用过。我在试图理解我可以拥有这样一件事的情景。不,你在试图找出你是否可以拥有这样一件事。编译器会告诉您,我不明白您为什么需要论坛。在多态性的代码示例中始终使用Animal=)
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
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