【问题标题】:Regarding priority is to be given to enums over interfaces [duplicate]关于优先于接口的枚举[重复]
【发布时间】:2012-08-20 18:05:51
【问题描述】:

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

}  

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

【问题讨论】:

  • 简单的回答:他们不应该使用接口来存储新代码中的常量。

标签: java


【解决方案1】:

只需使用enums。它们使您的代码更加类型安全(而不是您的示例中的 "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 { ... }

向后兼容性

如果您需要使用enums 的Java 代码来处理旧的类文件,只需将-source 1.5 and -target 1.4 传递给javac 以将enums 编译为兼容的东西。这是因为 enums 只是 syntactic sugar 用于常规 JS 类。一个警告:一些支持类(EnumMapEnumSet)在 Java -target 不会帮助您很好地集成该代码。

【讨论】:

    【解决方案2】:

    Enum 仅在 java 1.5 中引入。我猜您发布的代码可能来自 1.5 之前的版本

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

    【讨论】:

    • 更有可能的程序员阅读在 Java 5 普及之前编写的网络文章
    • @thinksteep..能否请您以枚举的形式更新我上面的代码,并告诉我类是如何访问常量的,这将使理解更加清晰..!!
    【解决方案3】:

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

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

    public enum OlympicMedal {  
    
       GOLD, SILVER, BRONZ  
    
    }  
    

    被另一个类访问:

    OlympicMedal medal = OlympicMedal.GOLD;

    或者如果你静态导入OlympicMedal

    OlympicMedal medal = GOLD;

    【讨论】:

    • 谢谢,能否请您以枚举的形式更新我上面的代码,并告诉我类是如何访问常量的,这将使理解更加清晰..!!
    • 你能否展示另一个类将如何访问这些常量,我想看到的另一件事..!!
    猜你喜欢
    • 2020-03-08
    • 2015-07-10
    • 1970-01-01
    • 1970-01-01
    • 2012-05-26
    • 2016-09-03
    • 1970-01-01
    • 2013-05-06
    • 1970-01-01
    相关资源
    最近更新 更多