如何解决访问自定义枚举字段
如何访问(无反射)来自其他班级的RAIN
和WIND
字段?当我尝试引用Season.FALL.RAIN
,Season.FALL.WIND
并调用Season.FALL.getWind()
时,IDE显示错误。
Season
枚举可以正常编译:
public enum Season {
WINTER,SPRING,SUMMER,FALL {
public static final String RAIN = "rain";
public final String WIND = "wind";
public String getWIND() {
return WIND;
}
};
}
如果我不能从外部访问它们,为什么Java允许这些成员?即使在Season
枚举内,我也无法访问它们。我使用Java 11。
解决方法
这是因为FALL
常量类是Season
类的子类-您可以将其声明为匿名类,然后再想象一下。
您也可以在没有枚举的情况下模拟类似情况:
public static void main(String[] args) {
class C {
public int i;
}
C c = new C() {
public int a;
};
System.out.println(c.a); // wont compile
}
c
实例仍被视为C
类(尽管实际的类类似于C$1
),并且{{1}中没有a
字段}类。 Java允许C
字段服务于子类的成员,而不是服务于外部的任何人。子类存在,但不能从字面上访问。反射访问是可能的。枚举示例也是如此。
也可以将内部属性定义为枚举,这将起作用:
enum Season {
UNDEFINED,WINTER(Phenomenon.RAIN),SPRING(Phenomenon.WIND),SUMMER(Phenomenon.HOT),FALL(Phenomenon.RAIN,Phenomenon.WIND);
enum Phenomenon {
RAIN,WIND,HOT
};
Phenomenon[] phenomena;
Season(Phenomenon... phenomena) {
this.phenomena = phenomena;
}
@Override
public String toString() {
return this.name() + ": " + Arrays.toString(phenomena);
}
}
然后打印/搜索:
for (Season s : Season.values()) {
System.out.println(s);
}
System.out.println();
Season s = Season.SPRING;
for (Phenomenon p : new Phenomenon[] { Phenomenon.HOT,Phenomenon.WIND }) {
if (Arrays.binarySearch(s.phenomena,p) >= 0) {
System.out.println(String.format("Phenomenon [%s] happens in season [%s]",p,s.name()));
} else {
System.out.println(String.format("Phenomenon [%s] does not happen in season [%s]",s.name()));
}
}
将打印:
UNDEFINED: []
WINTER: [RAIN]
SPRING: [WIND]
SUMMER: [HOT]
FALL: [RAIN,WIND]
Phenomenon [HOT] does not happen in season [SPRING]
Phenomenon [WIND] happens in season [SPRING]
,
不确定为什么要这样做,但是可以这样:
public enum Season {
WINTER,SPRING,SUMMER,FALL;
public static final String RAIN = "rain";
public static final String WIND = "wind";
}
如果您只想在FALL
中访问这两个字段,那是不可能的。每个枚举值都属于相同的最终类,如果您在一个类中有一个静态字段,则无论您引用的是哪个值,该字段都可用。
那是因为Season声明不接受这些方法和属性。
尝试构建更详细的枚举,例如:
public enum Season {
WINTER,FALL("rain","wind");
private String rain;
private String wind;
private Season () {}
private Season(String rain,String wind) {
this.rain = rain;
this.wind = wind;
}
public String getRain() { return this.rain; }
public String getWind() { return this.wind; }
}
因此您可以像下面这样访问这些属性:
System.out.println(Season.FALL.getRain());
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。