相关疑难解决方法(0)

如何为Java 6枚举实现values()?

在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()返回一个新实例.

java enums

66
推荐指数
1
解决办法
2万
查看次数

对公共枚举的引用导致匿名类

我在编译时得到一个我没想到的匿名类.相关代码如下,然后更详细的解释:

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)

java enums anonymous anonymous-class switch-statement

12
推荐指数
1
解决办法
1732
查看次数

Java:枚举:NoClassDefFoundError

我在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 enums jboss noclassdeffounderror maven

8
推荐指数
1
解决办法
3225
查看次数

什么意思是带有美元符号和数字.class的java文件名(名称$ 1.class)?

当我编译我的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)

java enums overriding class inner-classes

7
推荐指数
1
解决办法
3739
查看次数

switch使用未定义的内部类在tomcat中导致NoClassDefFoundError

我有一个非常简单的枚举

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. 为什么Java尝试加载内部类(如可见$1).没有内在的课程ComponentController,也从来没有.
  2. 为什么Java认为交换机使用这个内部类作为其参数
  3. my.package.data.util.Mode类消失

这里发生了什么?


更多信息不在原始问题中

  • ComponentController …

java tomcat

7
推荐指数
1
解决办法
1739
查看次数

编译后在Java枚举中创建的隐式内部类

我正在学习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.但是为什么在这个代码中它创建了没有内部类.

java enums

6
推荐指数
0
解决办法
56
查看次数

为什么<filename> $ 1.class生成?

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.classEnum1$1.class当我编译此代码.当我仅注释掉开关盒部件Enum1.classDay.class生成时.

交换机中的内容是生成额外Enum1$1.class文件的原因?

java enums class switch-statement

5
推荐指数
1
解决办法
738
查看次数

不存在的隐藏Java内部类的奥秘

我正在为学校制作一个成绩单项目,它正在编译好像有一个匿名的内部课程,但我没有写过任何内容.为什么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)

SemesterInfo.java

import java.util.Scanner;

public class …
Run Code Online (Sandbox Code Playgroud)

java anonymous-inner-class javac

5
推荐指数
1
解决办法
165
查看次数