【问题标题】:Identifying the specific enum within the constructor识别构造函数中的特定枚举
【发布时间】:2013-02-15 14:42:55
【问题描述】:
public enum Batman
{
    Rat, Cat, Bat;

    private boolean isMatch;

    // Constructor
    Batman()
    {
        this.isMatch =  (this.compareTo(Bat) == 0) ? true : false;
    }

    public boolean isMatch()
    {
        return this.isMatch;
    }
}

对于构造函数行,我收到错误: 无法在初始化程序中引用静态枚举字段 Batman.Bat

我主要是想弄清楚是否可以在构造函数中识别特定的 ENUM。
另外我想保存“isMatch”值的原因是我不想每次都评估它应该是什么。 我从一开始就知道,所以我只想保存值,因此当调用时它不是评估 但只是将值传回

我知道还有其他方法可以解决这个问题:

  1. 修改构造函数接受参数:

    老鼠(假),猫(假),蝙蝠(真);

    // Constructor
    Batman(boolean isMatch)
    {
        this.isMatch = isMatch;
    }
    
  2. 更改 isMatch()

public boolean isMatch()
  {
      return (this.compareTo(Bat) == 0) ? true : false;
  }

任何建议都会很棒。

谢谢

【问题讨论】:

  • 您不必在第二个示例中更改 isMatch()
  • 您的isMatch 应该只返回您为枚举设置的布尔字段的值。看起来你正试图让你的生活变得不必要地困难。
  • 你做不到。您正在尝试与尚不存在的事物进行比较。我喜欢你的选项2。
  • 这个问题没有意义!!!

标签: java constructor enums


【解决方案1】:

正如其他人所说,您不能在构造函数中引用特定的 Enum 值。显而易见的解决方案是这样写:

public enum Batman
{
    Rat, Cat, Bat;


    public boolean isMatch()
    {
        return this == Bat;
    }
}

(顺便说一句,Enum 不需要等于)

但如果评估this == Bat 真的让你感到困扰,你可以为 Bat 覆盖 isMatch:

public enum Batman
{
    Rat, Cat,
    Bat {
        @Override
        public boolean isMatch() {
            return true;
        }
    };

    public boolean isMatch()
    {
        return false;
    }
}

这样,您没有比较,而是使用枚举值覆盖的方法。

还有一个变体,只是为了好玩:

public enum Batman
{
    Rat, Cat,
    Bat {{
            this.isMatch = true;
        }};

    protected boolean isMatch = false;

    public boolean isMatch()
    {
        return isMatch;
    }
}

(请注意符号{{ }} 以及 isMatch 必须受到保护而不是私有的事实,以便 Bat 实例可以访问它。)

【讨论】:

  • 另外,isMatch 也不是很清楚的方法名。我希望在真正的代码中它会像 isBat 一样。
  • @PatriciaShanahan 是的,在真正的代码中,枚举是 MatchType,我忘了用更合理的东西替换 isMatch
  • 感谢您展示可选方式。我很想知道 @Override, {{}} 选项的性能是否比在构造函数选项中将值作为参数传递更好或更差
  • 我怀疑在这类事情中性能根本不是问题。但是为了记录,这最后两个解决方案使用了一个合成类,该类仅针对实例Bat 覆盖Batman。所以你在运行时又加载了一个类,编译器可能不再内联方法isMatch。所以理论上它比较慢。如果您看到任何明显的差异,我会感到非常惊讶,但如果有,我给您的第一个解决方案可能是最好的。
  • @CyrilleKarmann 谢谢你。了解理论就足够了。我正在尝试学习内部原理和怪异之处,以便我可以适当地使用事物
【解决方案2】:

来自Book Effective Java

枚举构造函数不允许访问枚举的静态字段, 除了编译时常量字段。这个限制是必要的 因为这些静态字段还没有被初始化时 构造函数运行。

【讨论】:

    【解决方案3】:

    您绝对不能在构造函数中引用任何特定的 ENUM,因为当您想要引用它时需要创建它,而您只是在创建它!
    我会选择选项 1,因为您将依赖的特定知识置于枚举本身的内部实现之外。

    【讨论】:

      猜你喜欢
      • 2011-08-20
      • 2020-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-03
      • 2019-12-12
      • 1970-01-01
      相关资源
      最近更新 更多