在Java中,您可以按如下方式创建枚举:
public enum Letter {
A, B, C, D, E, F, G;
static {
for(Letter letter : values()) {
// do something with letter
}
}
}
Run Code Online (Sandbox Code Playgroud)
这个问题涉及"values()"方法.具体来说,它是如何实现的?通常,我可以在Eclipse中使用F3或CTRL + Click跳转到Java类的源代码(即使对于String,Character,Integer甚至Enum这样的类).可以查看其他枚举方法的来源(例如,valueOf(String)).
"values()"每次调用时都会创建一个新数组吗?如果我将它分配给局部变量然后修改其中一个元素,会发生什么(显然这不会影响values()返回的值,这意味着每次都会分配一个新数组).
它的代码是原生的吗?或者JVM /编译器是否专门处理它,只有当它无法证明它不会被修改时才从values()返回一个新实例.
我在编译时得到一个我没想到的匿名类.相关代码如下,然后更详细的解释:
CircuitType.java的整体:
public enum CircuitType { V110A20, V110A30, V208A20, V208A30 }
Run Code Online (Sandbox Code Playgroud)
来自Auditor.java,第3-9行:
public class Auditor {
private String[] fileNames;
private int numV110A20;
private int numV110A30;
private int numV208A20;
private int numV208A30;
Run Code Online (Sandbox Code Playgroud)
来自Auditor.java,第104-121行:
[...]
switch (newCircuit.getType()) {
case V110A20:
this.numV110A20++;
break;
case V110A30:
this.numV110A30++;
break;
case V208A20:
this.numV208A20++;
break;
case V208A30:
this.numV208A30++;
break;
default:
System.err.println("An Error Has Occured.");
System.exit(-1);
break;
}
[...]
Run Code Online (Sandbox Code Playgroud)
从Circuit.java,第1-5行:
public class Circuit {
private CircuitType myType;
public CircuitType getType() {
return this.myType;
}
[...]
Run Code Online (Sandbox Code Playgroud)
当命令
javac *.java …Run Code Online (Sandbox Code Playgroud) 我在J2EE应用程序中使用枚举时遇到问题.我在无状态服务bean中的switch case中使用enum.
在运行期间,我在switch语句中看到以下异常:
Caused by: java.lang.NoClassDefFoundError: com/comp/service/TestServiceImpl$1
Run Code Online (Sandbox Code Playgroud)
在SO上的一个主题上已经广泛讨论了这个问题.但我没有看到任何解决方案来解决此问题.
在我的情况下,我使用JBOSS EAP6.1服务器.JDK版本是1.7.代码是在Eclipse IDE中使用Maven构建的.应用程序部署为EAR存档.如何在我的EAR存档中的类路径中添加这个额外生成的类文件?有没有其他方法可以解决这个问题?
2014年6月29日更新: 我尝试从命令行构建应用程序.然后生成这个额外的类文件.而且我能够成功地执行应用程序.这似乎是日食的错误.知道怎么解决吗?
来自EAR项目的pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>demo-maven</artifactId>
<groupId>com.comp.demo</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>demo-ear</artifactId>
<packaging>ear</packaging>
<name>demo - ear</name>
<url>www.comp.com</url>
<licenses>
<license>
<name>Apache License, Version 2.0</name>
<distribution>repo</distribution>
<url>http://www.apache.org/licenses/LICENSE-2.0.html</url>
</license>
</licenses>
<dependencies>
<!-- Depend on the ejb module and war so that we can package them -->
<dependency>
<groupId>com.comp.demo</groupId>
<artifactId>demo-web</artifactId>
<type>war</type>
</dependency>
<dependency>
<groupId>com.comp.demo</groupId>
<artifactId>demo-service</artifactId>
<type>ejb</type>
</dependency>
</dependencies>
<build>
<finalName>${project.parent.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-ear-plugin</artifactId>
<version>${version.ear.plugin}</version> …Run Code Online (Sandbox Code Playgroud) 当我编译我的java Enum Day时,它会生成他的Day.class文件和8天$#.class Files,所以我想知道为什么编译器生成8 $#.class而不是7,因为我有7个枚举常量,但是8覆盖注释,我已经知道Dollar.class文件是为每个内部类或枚举常量生成的,但是八个.class文件为它生成了什么呢?
package com.kaissersoft.test.objective.one.three.enums;
public enum Day{
SUNDAY(01){
@Override
public void salute(){
System.out.println("Today is Sunday");
}
},
MONDAY(02){
@Override
public void salute(){
System.out.println("Today is Monday");
}
},
TUESDAY(03){
@Override
public void salute(){
System.out.println("Today is Tuesday");
}
},
WEDNESDAY(04){
@Override
public void salute(){
System.out.println("Today is Wednesday");
}
},
THURSDAY(05){
@Override
public void salute(){
System.out.println("Today is Thursday");
}
},
FRIDAY(06){
@Override
public void salute(){
System.out.println("Today is Friday");
}
},
SATURDAY(07){
@Override
public void salute(){
System.out.println("Today is Saturday");
}
}; …Run Code Online (Sandbox Code Playgroud) 我有一个非常简单的枚举
my.package.data.util
public enum Mode
{
SQLEXPORT, PREVIEW, PRINT
}
Run Code Online (Sandbox Code Playgroud)
应该使用哪个在另一个类中使用枚举
my.package.program.ComponentController
switch (_mode) { // line 278, _mode is of type my.package.data.util.Mode
case PREVIEW:
// Do thing for preview
break;
case SQLEXPORT:
// Do thing for SQL
break;
case PRINT:
// Do thing for print
break;
default:
throw new IllegalArgumentException();
}
Run Code Online (Sandbox Code Playgroud)
这两个类在同一个项目中,并编译成一个jar文件.
然后,Web项目正在使用此库(放入WEB-INF/lib文件夹中).但是,当需要使用这个库,特别是那个开关时,NoClassDefFoundError会发生:
NoClassDefFoundError:my/package/program/ComponentController $ 1
at my.package.program.ComponentController.doCall(ComponentController.java:278)
这是我在几个层面上无法理解的:
$1).没有内在的课程ComponentController,也从来没有.my.package.data.util.Mode类消失这里发生了什么?
更多信息不在原始问题中
ComponentController …我正在学习Enum并对此代码感到困惑.
enum Currency{
PENNY, NICKLE, DIME, QUARTER;
@Override
public String toString() {
switch (this) {
case PENNY:
System.out.println("Penny: ");
break;
case NICKLE:
System.out.println("Nickle: ");
break;
case DIME:
System.out.println("Dime: ");
break;
case QUARTER:
System.out.println("Quarter: ");
}
return super.toString();
}
};
public class Check{
public static void main(String[] args){
}
}
Run Code Online (Sandbox Code Playgroud)
当我编译javac Check.java我得到以下.class文件.
Check.class
Currency$1.class
Currency.class
Run Code Online (Sandbox Code Playgroud)
为什么Currency$1.class要创建?如何?背后的原因是什么?我知道内部类的$符号和1代表匿名类1.但是为什么在这个代码中它创建了没有内部类.
enum Day{ SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY}
class Enum1 {
public static void main(String args[]) {
Day day=Day.MONDAY;
switch(day) {
case SUNDAY:
System.out.println("sunday");
break;
case MONDAY:
System.out.println("monday");
break;
default:
System.out.println("other day");
}
}
}
Run Code Online (Sandbox Code Playgroud)
我看到Enum1.class,Day.class和Enum1$1.class当我编译此代码.当我仅注释掉开关盒部件Enum1.class并Day.class生成时.
交换机中的内容是生成额外Enum1$1.class文件的原因?
我正在为学校制作一个成绩单项目,它正在编译好像有一个匿名的内部课程,但我没有写过任何内容.为什么javac在没有编写任何内部类(包括枚举或异常)的情况下编译内部类?有问题的文件是SemesterInfo $ 1.class,由SemesterInfo.java编译.我见过类似的问题,其中实际上有内部类,但这里没有.我从Java库中抛出一个异常(UnsupportedOperationException),但它已经在库中定义(java.lang.UnsupportedOperationException),因此不是匿名的或内部类.我的目录如下:
02/20/2016 02:03 PM 915 AddResult.class
02/15/2016 09:16 PM 848 AddResult.java
02/20/2016 02:03 PM 1,032 Console.class
02/05/2016 08:27 AM 1,315 Console.java
02/20/2016 02:03 PM 1,624 CourseInfo.class
02/19/2016 10:56 AM 9,203 CourseInfo.java
02/20/2016 02:03 PM 2,244 CourseInfoTester.class
02/17/2016 05:15 PM 2,226 CourseInfoTester.java
01/22/2016 10:55 AM 3,769 Keyboard.class
02/20/2016 02:03 PM 686 SemesterInfo$1.class
02/20/2016 02:03 PM 6,810 SemesterInfo.class
02/20/2016 01:57 PM 36,263 SemesterInfo.java
02/20/2016 02:03 PM 1,350 SemesterInfoTester.class
02/17/2016 11:59 PM 1,050 SemesterInfoTester.java
Run Code Online (Sandbox Code Playgroud)
import java.util.Scanner;
public class …Run Code Online (Sandbox Code Playgroud)