gpt4 book ai didi

java - 是否可以对枚举进行子类化以强制编译器仅接受某些枚举值?

转载 作者:行者123 更新时间:2023-11-30 07:41:07 25 4
gpt4 key购买 nike

JavaFX 声明枚举 KeyCode,它枚举常见键盘上每个键的代码。我目前正在声明一个只有在给定修饰键时才有意义的函数。它看起来像这样:

void doStuff(KeyCode c){
if(!c.isModifierKey()) throw new IllegalArgumentException();
...
}

但我认为如果编译器可以为我进行此检查,事情会干净得多。因此,如果我能够以某种方式将 KeyCode“扩展”为仅包含修饰键的子集,我的代码将变得更加干净。有人知道如何做到这一点吗?

最佳答案

您不能在 Java 中子类化 enum

您需要定义自己的 KeyCode 枚举。但我怀疑你不会在这里获得太多澄清。您可能希望将 if 命令封装到 assert 方法中,如下所示:

assertModifierKeyCode(KeyCode c) {
if(!c.isModifierKey()) throw new IllegalArgumentException();
}

那么你的方法的意思就简洁一点了:

void doStuff(KeyCode c){
assertModifierKeyCode(c);
...
}

当然,您可以在调用 doStuff 之前检查键码约束,然后您可以拥有一个 ModifierCode 枚举,您将其误用作过滤器:

ModifierCode m = ModifierCode.fromKeyCode(c); // could throw Exception
doStuff( m );

...

void doStuff( ModifierCode m ) {
switch ( m ) {
case ...
}

要使 KeyCode 仍然可用,您可以构建嵌入了 KeyCodeModifierCode:

public enum ModifierCode {

LSHIFT(KeyCode.LeftShift),
RSHIFT(KeyCode.RightSHift) // bear with me, I dont have KeyCode enum in memory
;

final private KeyCode keyCode;

private ModifierCode(KeyCode c) {
this.keyCode = c;
}

public KeyCode getKeyCode() { // maybe asKeyCode() would also be a nifty name :-)
return keyCode;
}

public static ModifierCode fromKeyCode(KeyCode c) {
for(ModifierCode m : values() ) {
if( m.keyCode == c ) {
return m;
}
}
throw IllegalArgumentException("No MOdifierCode with that KeyCode!");
}
}

关于java - 是否可以对枚举进行子类化以强制编译器仅接受某些枚举值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34688554/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com