2

我仍然不清楚一件事,为什么人们只使用接口来存储常量......当 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  

}  

但是请告知该类现在将如何访问此常量..!!

4

3 回答 3

4

只需使用enums。它们使您的代码更加类型安全(而不是像您的示例中那样“字符串类型化”),并且习惯于常见 Java 习惯用法的开发人员更容易阅读和维护。

方便的名字

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

import static mypackage.MyEnum.*;

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

package mypackage;

public class OlympicAthlete implements OlympicMedal { ... }

改为使用 anenum OlympicMedal将是

package mypackage;
import static mypackage.OlympicMedal.*;

public class OlympicAthlete { ... }

向后兼容性

如果您需要使用enums 处理旧类文件的 Java 代码,只需传递-source 1.5-target 1.4to将sjavac编译成兼容的东西。enum这是有效的,因为enums 只是常规 JS 类的语法糖。一个警告:一些支持类 ( EnumMap, EnumSet) 在 Java <= 1.4 下不可用,因此-target不会帮助您很好地集成该代码。

于 2012-08-20T18:09:28.683 回答
0

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

由于类型安全,枚举是最佳选择。

于 2012-08-20T18:07:54.517 回答
0

为什么人们只使用接口来存储常量

可能是早期 Java 版本的坏习惯?改为
使用enums

public enum OlympicMedal {  

   GOLD, SILVER, BRONZ  

}  

由另一个类访问:

OlympicMedal medal = OlympicMedal.GOLD;

或者如果您静态导入OlympicMedal

OlympicMedal medal = GOLD;

于 2012-08-20T18:10:28.323 回答