关于接口的枚举优先级

时间:2012-08-20 18:05:52

标签: java

有一件事我还不清楚为什么人们只使用界面来存储常量..当java 5提出它的Enums的新功能时..

    interface OlympicMedal {
  static final String GOLD = "Gold";
  static final String SILVER = "Silver";
  static final String BRONZE = "Bronze";
}

另一个班级正在实施它..

public class OlympicAthlete implements OlympicMedal {

  public OlympicAthlete( int aId ){
    //..elided
  }

  //..elided

  public void winEvent( ){
    //the athlete gets a gold medal
    //note the reference is not qualified, as
    //in OlympicMedal.GOLD
    fMedal = GOLD;
  }

  // PRIVATE //
  private String fMedal; //possibly null
} 

如上所示同样的事情也可以通过枚举轻松建立,如果我有选择存储上面的常量,请告诉我,我应该选择枚举或界面..!

枚举就像......

public enum OlympicMedal {  

   GOLD, SILVER, BRONZ  

}  

但请告诉我们班级现在如何访问这些常数.. !!

3 个答案:

答案 0 :(得分:4)

只需使用enum s。它们使您的代码更加类型安全(而不是像示例中的"stringly typed"),并且更容易被习惯于常见Java习语的开发人员阅读和维护。

方便的名称

如果您需要更短的名称,静态导入将有所帮助。

import static mypackage.MyEnum.*;

在您的示例中,interface使用代码

package mypackage;

public class OlympicAthlete implements OlympicMedal { ... }

更改为使用enum OlympicMedal而不是

package mypackage;
import static mypackage.OlympicMedal.*;

public class OlympicAthlete { ... }

向后兼容性

如果您需要使用enum来处理旧类文件的Java代码,只需将-source 1.5 and -target 1.4传递给javac即可将enum编译为兼容的内容。这是有效的,因为enum对于常规JS类只是syntactic sugar。需要注意的是:某些支持类(EnumMapEnumSet)在Java< = 1.4下不可用,因此-target无法帮助您使代码集成良好。

答案 1 :(得分:0)

Enum仅在java 1.5中引入。我猜您发布的代码可能来自1.5以上

由于类型安全,

枚举是最佳选择。

答案 2 :(得分:0)

  

为什么人们使用界面只存储常量

或许早期版本的Java的坏习惯? 请改用enums

public enum OlympicMedal {  

   GOLD, SILVER, BRONZ  

}  

由另一个班级访问:

OlympicMedal medal = OlympicMedal.GOLD;

或者如果您静态导入OlympicMedal

OlympicMedal medal = GOLD;