【问题标题】:IntelliJ implement method for all enum valuesIntelliJ 实现所有枚举值的方法
【发布时间】:2018-06-27 20:52:48
【问题描述】:

鉴于我有一个“空”界面:

public interface Color {
}

还有一个实现上述接口的枚举类:

public enum Fruits implements Color  {

    APPLE,
    APRICOT,
    AVOCADO,
    BANANA,
    BLACKBERRY,
    BLUEBERRY,
    CHERRY,
    COCONUT,
    CRANBERRY,
    DATE,
    DURIAN,
    ELDERBERRY,
    FIG,
    JACKFRUIT,
    KIWI,
    LEMON,
    LIME,
    LYCHEE,
    MANGO,
    MELLON,
    ORANGE,
    PAPAYA,
    PASSION_FRUIT,
    PEAR,
    PLUM,
    PINEAPPLE,
    POMELO    
}

编码了一阵子,回到那个界面,添加了一个方法,比如:

public interface Color {
    Color getColor();
}

IntelliJ Idea 肯定会告诉我每个枚举值都应该实现新添加的方法。我现在可以做的是跳转到每个枚举值(使用 F2 作为跳转到每个值的快捷方式),然后使用 ALT + ENTER 创建它的默认实现。

APPLE {
    @Override
    public Color getColor() {
        return null;
    }

},
APRICOT {
    @Override
    public Color getColor() {
        return null;
    }
},
AVOCADO {
    @Override
    public Color getColor() {
        return null;
    }
},
...

一旦我意识到实现这个接口的不仅仅是这个枚举,这很快就会失控。


澄清

我正在 IntelliJ Idea 中搜索 键盘快捷键,这是一个提供代码生成功能的 IDE一次创建每个枚举值的空方法树桩。

IntelliJ Idea 确实为每个单独的枚举值分别提供了这样的功能,这让我想到了一个问题:可以一次为所有值完成吗?

【问题讨论】:

  • 你有一个 whole 很多重复,看起来某种重构或参数化会使事情变得更清晰。
  • 看起来可能是这样。请理解上面的例子来解释手头的问题,仅此而已。
  • 我的意思是你的枚举值往往是重复的——你明确地列出了看起来像一些笛卡尔积的东西。这通常不是最好的方法。
  • 如果我换成不同种类的水果,你会回答这个问题吗?
  • @JohnSmith 在your original question 中,没有任何迹象表明您正在 IntelliJ IDEA 中寻找键盘快捷键。问题的核心是难道没有更短的方法来实现这一点,让我们一次为每个枚举值创建默认方法吗? 我们回答了这个问题。如果您认为这种解释是错误的或不是强制性的,请再想一想。至少有 3 名高级用户以这种方式解释了您的问题,因此很有可能是您的问题存在问题,而不是我们。

标签: java intellij-idea


【解决方案1】:

当然……只需在界面上创建一个default method

default String getSomething(Any any) {
    return null;
}

【讨论】:

  • 不,这不能满足我的要求
【解决方案2】:

您可以在枚举类本身而不是在每个枚举值中提供默认实现:

public enum DirectCallRate implements KeyPerformanceIndicator  {

    COUNT,
    COUNT_ANSWERED,
    COUNT_UNANSWERED,
    COUNT_EXTERNAL,
    COUNT_ANSWERED_EXTERNAL,
    COUNT_UNANSWERED_EXTERNAL,
    COUNT_INTERNAL,
    COUNT_ANSWERED_INTERNAL,
    COUNT_UNANSWERED_INTERNAL,
    COUNT_INBOUND,
    COUNT_ANSWERED_INBOUND,
    COUNT_UNANSWERED_INBOUND,
    COUNT_OUTBOUND,
    COUNT_ANSWERED_OUTBOUND,
    COUNT_UNANSWERED_OUTBOUND,
    COUNT_EXTERNAL_OUTBOUND,
    COUNT_ANSWERED_EXTERNAL_OUTBOUND,
    COUNT_UNANSWERED_EXTERNAL_OUTBOUND,
    COUNT_EXTERNAL_INBOUND,
    COUNT_ANSWERED_EXTERNAL_INBOUND,
    COUNT_UNANSWERED_EXTERNAL_INBOUND,
    COUNT_INTERNAL_OUTBOUND,
    COUNT_ANSWERED_INTERNAL_OUTBOUND,
    COUNT_UNANSWERED_INTERNAL_OUTBOUND,
    COUNT_INTERNAL_INBOUND,
    COUNT_ANSWERED_INTERNAL_INBOUND,
    COUNT_UNANSWERED_INTERNAL_INBOUND;

    @Override
    public String getSomething(Any any) {
        return null;
    }
}

我认为在这种情况下,它比在接口中创建默认方法更好,因为默认实现似乎主要与枚举相关,而不是与接口的所有其他实现者相关。

【讨论】:

  • 不,这不能满足我的要求
  • 为什么不呢?请解释一下。
  • @JohnSmith:这正是你在问题​​中要求的。
【解决方案3】:

这样做没有捷径。

【讨论】:

  • @baudsp 你能解释一下这不能回答问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多