使用接口模拟可扩展的枚举

时间:2013-11-22 17:49:00

标签: java maven enums

所以我在这里尝试了关于编写可扩展枚举的“Effective Java 2nd edition”练习。

我遇到了一个非常奇怪的问题 - 我让每个枚举实例实现了接口方法,并且在eclipse中看起来都很好。但是当我尝试通过maven编译它时,它失败了,虽然eclipse之前根本没有抛出任何编译错误(我的eclipse和maven都使用相同的JDK:1.6.0_33-b05)。事实证明,我必须在enum(所有枚举实例之外)中覆盖接口方法[我将其称为方法X ],以便修复此问题!

以下是解释此问题的示例:

接口

public interface IDay
{
  public boolean isHoliday(); 
}

枚举:

public enum Day implements IDay
{
  SATURDAY
  {
    @Override
    public boolean isHoliday()
    {
      return true;
    }
  },
  SUNDAY
  {
    @Override
    public boolean isHoliday()
    {
      return true;
    }
  },
  MONDAY
  {
    @Override
    public boolean isHoliday()
    {
      return false;
    }
  };

  // Method X: the project won't compile for me without this method!
  public boolean isHoliday()
  {
    return false;
  }

}

调用:

public class DayTester
{
  public static void main(final String[] args)
  {
    // line Y: this line won't maven compile if I got rid of the method X
    System.out.println("Sunday: " + Day.SUNDAY.isHoliday());
  }
}

奇怪的是,没有方法'X',eclipse完全没问题但是maven编译会在Y行上失败

  

[错误]无法执行目标   org.apache.maven.plugins:Maven的编译器插件:2.3.2:编译   项目X上的(default-compile):编译失败   [错误] DayTester.java:[7,46]找不到符号[ERROR]符号:   方法isHoliday()[ERROR] location:class Day

如果我有方法X,我的eclipse保存操作会自动插入@Override。删除方法X会在我的eclipse中抛出编译错误,因为我之前使用了Override注释。

以下是我的问题: 1.为什么eclipse在这种情况下不会编译maven? 2.覆盖注释错误在这里意味着什么? 方法X是否可以以某种方式访问​​?我错过了什么?

1 个答案:

答案 0 :(得分:0)

@Override注释

  

@Override - 检查该方法是否为覆盖。如果在其中一个父类或已实现的接口

中找不到该方法,则会导致编译错误

Eclipse配置

Properties > Java Compiler > Compiler compliance level = 1.6

在项目级别检查Compiler compliance level

Properties > Java Compiler > Errors/Warnings

@Override注释位于注释下,默认情况下会被忽略。

Maven配置

将此属性添加到pom.xml

<properties>
   <maven.compiler.source>1.6</maven.compiler.source>
   <maven.compiler.target>1.6</maven.compiler.target>
</properties>

这是由maven-compile-plugin

发布的
  
    

请注意,目前默认的源设置为1.5,默认目标设置为1.5,与您运行Maven的JDK无关。如果要更改这些默认值,则应按照Setting the -source and -target of the Java Compiler

中的说明设置源和目标   

了解更多