我注意到enums在编译膨胀总大小之后引入了许多额外的类文件(Class $ 1).它似乎附属于甚至使用枚举的每个类,并且这些通常是重复的.
为什么会发生这种情况,并且有一种方法可以在不删除枚举的情况下阻止这种情况
(问题的原因是空间对我来说是非常宝贵的)
编辑
在进一步研究这个问题时,每次在Enum上使用开关时,Sun的Javac 1.6都会创建一个额外的合成类.它使用某种SwitchMap.这个网站有更多信息,这里告诉你如何分析Javac正在做什么.
每次在枚举上使用开关时,额外的物理文件似乎都要付出高昂的代价!
有趣的是,Eclipe的编译器不会生成这些附加文件.我想知道唯一的解决方案是切换编译器吗?
无论如何通过将枚举与给定的字符串进行比较来检查枚举是否存在?我似乎找不到任何这样的功能.我可以尝试使用该valueOf方法并捕获异常,但我被教导说捕获运行时异常并不是一种好的做法.有人有什么想法吗?
假设我有一个枚举:
enum E {
A, B, C;
}
Run Code Online (Sandbox Code Playgroud)
正如所示这个答案由lucasmo,枚举值存储在它们初始化的顺序静态数组,你可以在以后检索(的克隆)这个数组E.values().
现在假设我想要实现E#getNext并且E#getPrevious以下所有表达式都评估为true:
E.A.getNext() == E.B
E.B.getNext() == E.C
E.C.getNext() == E.A
E.A.getPrevious() == E.C
E.B.getPrevious() == E.A
E.C.getPrevious() == E.B
Run Code Online (Sandbox Code Playgroud)
我目前的实施getNext如下:
public E getNext() {
E[] e = E.values();
int i = 0;
for (; e[i] != this; i++)
;
i++;
i %= e.length;
return e[i];
}
Run Code Online (Sandbox Code Playgroud)
和类似的方法getPrevious.
然而,这段代码充其量似乎很麻烦(例如,"空" for循环,可论证滥用计数器变量,并且最坏的可能是错误的(可能反思).
在Java 7中实现枚举类型的最佳方法getNext和getPrevious …
我正在开发一个作为java jar分发的库,我正在运行proguard,以便只暴露所需的接口.我有一个配置类,包含一堆成员变量和一些枚举定义.我的proguard脚本保留了成员变量,但枚举定义正在被混淆.我已经尝试了所有我能想到的强迫proguard保留这些内部定义和公共枚举,但我无法让它工作.
现在我正在使用:
-keep public class com.stuff.MyConfigObject {
public *;
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
Run Code Online (Sandbox Code Playgroud)
如果我尝试:
-keep public enum com.stuff.MyConfigObject.MyEnum
Run Code Online (Sandbox Code Playgroud)
我得到一个模棱两可的错误:"注意:配置引用未知类'com.stuff.MyConfigObject.MyEnum'"
谢谢您的帮助!
Java枚举是类.它们被编译为类.
如何编译以下示例?什么是"班级版"?什么是确切的类代码?我想要实际的Java代码.
public enum Ordinals {
FIRST("st"),
SECOND("nd"),
THIRD("rd");
private String notation;
private Ordinals(String notation) {
this.notation = notation;
}
public String getNotation() {
return notation;
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个类似下面的枚举,但是eclipse说每对对方的第一个定义都有错误.
public enum Baz{
yin(yang), //Cannot reference a field before it is defined
yang(yin),
good(evil), //Cannot reference a field before it is defined
evil(good);
public final Baz opposite;
Baz(Baz opposite){
this.opposite = opposite;
}
}
Run Code Online (Sandbox Code Playgroud)
我想要完成的是能够Baz.something.opposite用来获得相反的对象Baz.something.这有可能的解决方法吗?也许对于一个空的占位符yang和bad之前yin和good在此示例中定义的?
我想知道Java中的String数组是否可变?我知道字符串是不可变的,但字符串数组怎么样?
如果我有一个字符串数组,并更改内容,是否会创建一个新的字符串对象?或者实际值是否会改变?
提前致谢
嗨,我想创建一个数组,其中每个位置由枚举的值表示.
例如:
public enum type{
green,blue,black,gray;
}
Run Code Online (Sandbox Code Playgroud)
现在我想创建一个阵列,其中每个位置都是绿色,蓝色,......
我会更清楚.我想创建一个数组,其中位置由enum class.instead int []数组表示.[=] int []创建int [] array = new int [type.value]
enum有valueOf(string)获取枚举常量的方法,并且java.lang.Enum类名中valueOf(enumClassName, string)
我所发现的同一类型的方法都给出相同的输出.那么还有什么其他差异.如果没有差异那么为什么JSL添加Enum.valueOf()?
enum Season {
WINTER,SUMMER
}
class Test {
public static void main(String[] args) {
String season = "WINTER";
//switch (Season.valueOf(colObject)) // following line achieves same thing
switch (Enum.valueOf(Season.class, season)) // any other difference between both approach
{
case WINTER: {
System.out.println("Got it in switch case= VENDOR");
break;
}
default:
System.out.println("Fell thru.");
break;
}
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个程序如下:
package com.company;
enum Color {
RED, GREEN;
Color() {
System.out.println(Main.getRegionName(this));
}
}
public class Main {
public static String getRegionName(Color region) {
switch (region) {
case RED:
return "red";
case GREEN:
return "green";
default:
return "false";
}
}
public static void main(String[] args) {
Main m = new Main();
Color color = Color.RED;
}
}
Run Code Online (Sandbox Code Playgroud)
当我运行程序时,我得到以下例外:
Exception in thread "main" java.lang.ExceptionInInitializerError
at com.company.Main.getRegionName(Main.java:13)
at com.company.Color.<init>(Main.java:7)
at com.company.Color.<clinit>(Main.java:4)
at com.company.Main.main(Main.java:25)
Caused by: java.lang.NullPointerException
at com.company.Color.values(Main.java:3)
at com.company.Main$1.<clinit>(Main.java:13)
... 4 more …Run Code Online (Sandbox Code Playgroud)