【问题标题】:Getting which Enum Constant is called获取调用哪个枚举常量
【发布时间】:2014-07-05 20:42:26
【问题描述】:

有没有办法为枚举中的每个常量调用不同的方法?

public enum ShipType {
   SMALL,MEDIUM,LARGE,ENORMOUS,TETRIS;

   public int[][] getRegionOfShip(int[] startingPosition, Aligment aligment){
      //How do can I decide which function to call?
   }
   private int[][] getRegionOfSmallShip(int[] startingPosition){
      ...
   }
   private int[][] getRegionOfMediumShip(int[] startingPosition, Aligment aligment){
      ...
   }

   private int[][] getRegionOfLargeShip(int[] startingPosition, Aligment aligment){
      ...
   }

   private int[][] getRegionOfEnourmusShip(int[] startingPosition, Aligment aligment){
      ...
   }

   private int[][] getRegionOfTetrisShip(int[] startingPosition, Aligment aligment){
      ...
   }
}

当我这样创建枚举时:

ShipType shipType = ShipType.SMALL;

我称之为:

shipType.getRegionOfShip(startingPosition,aligment);

我怎样才能做到,打电话给

private int[][] getRegionOfSmallShip(int[] startingPosition)

方法? 类似于检查 Enum 类中调用了哪个常量

【问题讨论】:

  • 只需覆盖每个常量的方法。
  • 简单地在方法中使用thisif(this == SMALL){//method call for small}

标签: java enums constants


【解决方案1】:

您可以重写该方法,而不是创建一个单独的方法来调用每个枚举值:

public enum ShipType {
SMALL{
    @Override
    public int[][] getRegionOfShip(int[] startingPosition, Aligment aligment){

    }
},
MEDIUM{
    @Override
    public int[][] getRegionOfShip(int[] startingPosition, Aligment aligment){

    }
};
public abstract int[][] getRegionOfShip(int[] startingPosition, Aligment aligment);

如果您选择此选项,您将避免在添加新船类型时必须在 ifs/switch 中添加案例,并且不会忘记在没有编译时错误的情况下实现该方法。

【讨论】:

    【解决方案2】:

    Java 没有函数指针,在这里创建类层次结构会过度工程,所以只需一个开关:

    public enum ShipType {
       SMALL,MEDIUM,LARGE,ENORMOUS,TETRIS;
    
       int[][] getRegionOfShip(startingPosition,aligment) {
           if (this == SMALL) {
               return  getRegionOfSmallShip(startingPosition)
           }
           else if (this == MEDIUM) {
               return  getRegionOfMediumShip(startingPosition);
           }
           etc.
       }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-22
      • 1970-01-01
      • 2016-09-12
      • 2015-08-21
      • 2017-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多