2009-12-28 5 views
9

컴파일 시간에 익명의 클래스가 생겨서 기대하지 않습니다. CircuitType.java의Public Enum을 참조하면 익명 클래스가됩니다.

전체 : Auditor.java에서

public enum CircuitType { V110A20, V110A30, V208A20, V208A30 } 

, 선 3-9 : Auditor.java에서

public class Auditor { 
    private String[] fileNames; 
    private int numV110A20; 
    private int numV110A30; 
    private int numV208A20; 
    private int numV208A30; 

, 선 관련 코드는 좀 더 자세한 설명을 다음 104-121 : Circuit.java에서

[...] 
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; 
} 
[...] 

, 선 1-5 :

public class Circuit { 
    private CircuitType myType; 
    public CircuitType getType() { 
     return this.myType; 
    } 
[...] 

명령

javac *.java 

가 실행되면 익명의 클래스 감사 $의 1.java가 생성됩니다. 이 파일들은 분명히 파일 시스템 디렉토리에 서로 가깝게 앉아있다.

줄 104-121이 주석 처리되면 익명의 클래스가 생성되지 않습니다.

처음에는 이것이 패키지 문제라고 생각했기 때문에 3 가지 클래스를 하나의 패키지에 넣었지만 제대로 작동하려면 패키지에 대해 충분히 알지 못했습니다. 진정한 패키지 문제라면 누군가가 레이블을 지정하는 방법을 정확히 안내 할 수 있습니까? 비록 내가 할 필요가 없다면 나는 그들을 포장하지 않아도 될 것입니다.

익명 클래스가 문제가되는 이유는 그러한 클래스가 일반적으로 네임 스페이스 문제를 의미한다는 사실 외에도 자동 컴파일을 위해 사용하는 Makefile이 손상된다는 것입니다. 내가 앞서 간 소스를 포함하는 작은 프로젝트를 구축 한

% javap 'Auditor$1' 
Compiled from "Auditor.java" 
class Auditor$1 extends java.lang.Object{ 
    static final int[] $SwitchMap$CircuitType; 
    static {}; 
} 
+1

불행하게도 내가 문제를 도울 수 있지만, +1 매우를 게시 잘 설명 된 질문. –

+1

이것은 아마도 여러분이 듣고 싶은 대답은 아니지만,'make'는 자바 개발을위한 적절한 도구가 아닙니다. 대신'ant '를 사용하는 것이 좋습니다. 보다 복잡한 응용 프로그램을 개발할 때 익명의 수업을 진행하게 될 것입니다. –

+0

Auditor.java에 대해 더 많이 알고 싶습니다. 여기에 언급 한 것을 토대로 볼 때 Circuit.java가 문제라고 믿기가 어렵습니다. – Shaun

답변

4

:

업데이트 첨부


내가이 비밀을 밝혀 수 있습니다 희망 콘솔 세션입니다 게시하고 주위에 프레임 워크를 컴파일하여 컴파일합니다. Circuit.class, CircuitType.class 및 Auditor.class와 같은 3 개의 클래스 파일이 예상대로 있습니다.

Java 1.6 이상. 그러나 다른 사람들이 지적했듯이 문제에 대한 진단은 잘못된 것 같습니다.

익명 클래스는 실수로 발생하기 쉬운 :

Circuit myCircuit = new Circuit() { 
    public CircuitType getCircuitType() { 
     return XXX; 
    } 
} 

같은 일반적으로 구조 예를 들어, 하나 만듭니다. 코드가 많을수록 좋은 SO 사람들은 오류를 정확하게 지적 할 수 있습니다.

클래스 파일을 javap 이상으로 분해하거나 "실제"Java 디스어셈블러 인 JD을 사용하여 수업 파일을 분해하는 것은 흥미롭고 유익합니다.


업데이트

광산에 새 감사 코드를 추가 ... 변화 없음. 익명의 클래스가 없습니다.

물론 코드는 정확합니다 (우리가 볼 수있는 한도 내에서). 그러나 디자인은 그리 좋아하지 않습니다. 어떤 사람들은 새로운 회로 유형이 나타날 때마다 진술서와 switch 성명을 연장해야한다고 지적합니다.

또한 열거 형의 "특수 기능"을 많이 사용하지 않습니다.

private int[] counters = new int[CircuitType.values().length]; 

    public void tallySomething() { 
     Circuit newCircuit = new Circuit(); 
     counters[newCircuit.getType().ordinal()]++; 
    } 

업데이트 나는 당신의 javap 출력이 매우 조명 발견 2

: 당신의 Auditor 방법의 매우 단순화 된 버전이있다. 아래 내 의견을 참조하십시오.

내 결론 : 네, 분명히 자바 IMPL 스위치에 대한 익명 클래스를 사용

  1. . 절름발이,하지만 합법적.
  2. 당신은 다음과 같은 옵션이 있습니다
    • switch
    • 익명 클래스와 함께 살고 다른 Java 구현을 사용하여 제거를; make을 골라 내고 ant을 사용하여 Java의 anon 클래스와 다른 낯선 곳을 포용하십시오. 당신은 단지 때문에 당신의 표준이 아닌 컴파일 설정의 문제가 발생하는 때문에

, 나는 마지막 솔루션으로 가서이 문제를 공격 할 것입니다.

+0

요청에 따라 Auditor.java의 코드가 더 많이 포함되었습니다. 104-121 행의 코드 블록은 해당 코드 블록이 주석 처리 될 때 익명 클래스가 생성되지 않으므로 그 원인을 확실히 알 수 있습니다. 나는 그 코드 블록과 관련된 모든 것을 포함했다고 생각한다. 필요한 것이 있으면 알려주세요. – Maarx

+0

내 답변에 대한 응답이 업데이트되었습니다. –

+0

내 마음이 날려. 두번. 확실히 switch 문을 가진 익명의 클래스가 있고, switch 문이 주석 처리 될 때 익명의 클래스가 존재하지 않습니다. 익명의 클래스를 얻지 못했다고 말했을 때, UNIX 개발 환경의 코드를 최신 JDK 업데이트가 포함 된 폐기 용 Windows 가상 머신으로 옮기고 다시 컴파일했습니다. 나는 여전히 switch 문과 익명의 클래스를 얻지 만, 아무것도 없다. – Maarx