我正在查看一些由公司其他部门维护的Java代码,顺便提一下,一些前C和C++开发人员。普遍存在的一件事是使用静态整数常量,例如classEngine{privatestaticintENGINE_IDLE=0;privatestaticintENGINE_COLLECTING=1;...}除了缺少“final”限定符之外,我对这种代码有点困扰。我希望看到,在学校主要接受Java培训,会更像classEngine{privateenumState{Idle,Collecting};...}但是,我的论点失败了。为什么,如果有的话,后者比前者更好? 最佳答案
我正在查看一些由公司其他部门维护的Java代码,顺便提一下,一些前C和C++开发人员。普遍存在的一件事是使用静态整数常量,例如classEngine{privatestaticintENGINE_IDLE=0;privatestaticintENGINE_COLLECTING=1;...}除了缺少“final”限定符之外,我对这种代码有点困扰。我希望看到,在学校主要接受Java培训,会更像classEngine{privateenumState{Idle,Collecting};...}但是,我的论点失败了。为什么,如果有的话,后者比前者更好? 最佳答案
(注意:已编辑问题;之前的意图不明确)考虑这段代码:publicfinalclassFoo{privateenumX{VALUE1,VALUE2}publicstaticvoidmain(finalString...args){finalXx=X.VALUE1;switch(x){caseVALUE1:System.out.println(1);break;caseVALUE2:System.out.println(2);}}}这段代码运行良好。但是,如果我替换:caseVALUE1://orVALUE2与:caseX.VALUE1://orX.VALUE2然后编译器提示:java:/
(注意:已编辑问题;之前的意图不明确)考虑这段代码:publicfinalclassFoo{privateenumX{VALUE1,VALUE2}publicstaticvoidmain(finalString...args){finalXx=X.VALUE1;switch(x){caseVALUE1:System.out.println(1);break;caseVALUE2:System.out.println(2);}}}这段代码运行良好。但是,如果我替换:caseVALUE1://orVALUE2与:caseX.VALUE1://orX.VALUE2然后编译器提示:java:/
JDK是Oracle的JDK1.8u65,但“低至”1.8u25也出现了问题。这是完整的SSCCE:publicfinalclassFoo{privateinterfaceX{defaultvoidx(){}}privateenumE1implementsX{INSTANCE,;}privateenumE2implementsX{INSTANCE,;}publicstaticvoidmain(finalString...args){Stream.of(E1.INSTANCE,E2.INSTANCE).forEach(X::x);}}此代码编译;但它在运行时失败:Exceptionint
JDK是Oracle的JDK1.8u65,但“低至”1.8u25也出现了问题。这是完整的SSCCE:publicfinalclassFoo{privateinterfaceX{defaultvoidx(){}}privateenumE1implementsX{INSTANCE,;}privateenumE2implementsX{INSTANCE,;}publicstaticvoidmain(finalString...args){Stream.of(E1.INSTANCE,E2.INSTANCE).forEach(X::x);}}此代码编译;但它在运行时失败:Exceptionint
有办法进入外面吗?publicclassOuterClass{Stringdata;publicvoidouterMethod(Stringdata){this.data=data;}publicenumInnerEnum{OPTION1("someData"),OPTION2("otherData");InnerEnum(Stringdata){//Doesnotwork:OuterClass.this.outerMethod(data);}}} 最佳答案 正如Eric所说,枚举是隐式静态的。做你想做的事,添加一个方法,callO
有办法进入外面吗?publicclassOuterClass{Stringdata;publicvoidouterMethod(Stringdata){this.data=data;}publicenumInnerEnum{OPTION1("someData"),OPTION2("otherData");InnerEnum(Stringdata){//Doesnotwork:OuterClass.this.outerMethod(data);}}} 最佳答案 正如Eric所说,枚举是隐式静态的。做你想做的事,添加一个方法,callO
我正在开发一个作为javajar分发的库,并且我正在对它运行proguard,以便只暴露所需的接口(interface)。我有一个带有一堆成员变量和一些枚举定义的配置类。我的proguard脚本很好地保留了成员变量,但是,枚举定义被混淆了。我已经尝试了所有我能想到的强制proguard保留这些内部定义和公共(public)枚举的方法,但我无法让它工作。我现在正在使用:-keeppublicclasscom.stuff.MyConfigObject{public*;}-keepclassmembersenum*{publicstatic**[]values();publicstatic*
我正在开发一个作为javajar分发的库,并且我正在对它运行proguard,以便只暴露所需的接口(interface)。我有一个带有一堆成员变量和一些枚举定义的配置类。我的proguard脚本很好地保留了成员变量,但是,枚举定义被混淆了。我已经尝试了所有我能想到的强制proguard保留这些内部定义和公共(public)枚举的方法,但我无法让它工作。我现在正在使用:-keeppublicclasscom.stuff.MyConfigObject{public*;}-keepclassmembersenum*{publicstatic**[]values();publicstatic*