2011-10-26 4 views
4

나는 프로젝트를 완료하려고 노력하고 있는데, 시도했지만, 나는 이것을 할 수 없다.Java에서 enum 복사 생성자를 사용하려면 어떻게해야합니까?

public enum Symbols { 
    /** 
    * The Seven 
    */ 
    SEVEN(12,"images/seven.jpg"), 
    /** 
    * The Watermelon 
    */ 
    WATERMELON(10,"images/watermelon.jpg"), 
    /** 
    * The Orange 
    */ 
    ORANGE(8,"images/orange.jpg"), 
    /** 
    * The Plum 
    */ 
    PLUM(6,"images/plum.jpg"), 
    /** 
    * The Lemon 
    */ 
    LEMON(4,"images/lemon.jpg"), 
    /** 
    * The Cherry 
    */ 
    CHERRY(2,"images/cherry.jpg"); 

    private int payout;    // Symbol payout value 
    private BufferedImage image; // Symbol image 
    private String icon;   // Symbol file name 

    /** Constructor - Payout must be positive and even, file name must not be null 
    * @param payout - Symbol payout amount 
    * @param icon - Symbol image file name 
    */ 
    Symbols(int payout, String icon){ 
     this.payout = payout; 
     this.icon = icon; 
     loadImage(icon); 
    } 

    /** Copy Constructor - Symbol must not be null 
    * @param s - A single symbol 
    */ 
    Symbols(Symbols s){ 
     payout = s.payout; 
     icon = s.icon; 
     loadImage(icon); 
    } 

가 지금은 주에 가서 같이 "의"라는 이름의 기호를 만들 수 있습니다 :

Symbols s = Symbols.CHERRY; 

을하지만 문제 "S"의 복사본을 만드는 데있어를 사용하여 여기에 열거입니다 복사 생성자가 주어진 :

Symbols t = Symbols(s); 

이 작업을 시도하면 오류가 발생합니다. "메서드 기호 (기호)가 유형 기호에 대해 정의되지 않았습니다."

감사합니다.

답변

0

열거 형은 일반 클래스가 아닙니다. 수동으로 생성 할 수는 없습니다. 열거 형 "클래스"자체는 기본적으로 "추상"클래스입니다. 각 값은 열거 형 "클래스"의 별개의 특정 하위 클래스로 구현됩니다.

4

그럼 공개로 설정해야하지만 여전히 작동하지 않습니다. Java에는 복사 생성자가 없습니다. 당신은 다음 오류 인 Enum을 '새롭게'할 수 없습니다. 어쨌든 자바는 JVM 당 각 열거 형 값의 복사본이 하나만 있도록 보장하기 위해 많은 노력을 기울이고 있습니다. 정확히 당신은 복사 생성자 을 필요로한다고 생각합니까?

솔루션 :

Symbols s = Symbols.CHERRY; 
Symbols t = s; 
+0

잘 정의한 경우 복사 생성자가 있습니다 (완료되었습니다). –

+0

@MarkPeters하지만 컴파일러는 직접 호출하지 않으면 컴파일러가 * 사용하지 않습니다. 예를 들어 주어진 코드는 컴파일되지 않을 것이고't = s; '라고 쓰면 컴파일러는 자동으로 생성자를 호출하지 않을 것이다. 나는 복사 생성자라고 부르지 않는다. 그냥 생성자. – EJP

+0

네가 맞아, 암묵적으로 (내가 C++과 같을 것처럼) 호출하는 문법이 있다는 점에서 복사 생성자가 아니다. 그러나 나는 여전히 자신의 클래스의 인스턴스를 "복사 생성자"로 취하는 생성자를 호출하는 것이 일반적이라고 생각한다. –

2

열거가 불변 세트가 있어야된다 - 당신은 새로운 것을 만들 수 있어야 아닙니다. 생성자는 개인용으로 적용됩니다 (표시된 것은 아니지만).

불변이므로 항상 Symbols.CHERRY 객체의 인스턴스가있는 경우 항상 동일한 인스턴스이므로 Equals 대신 객체 동등성 테스트를 할 수 있다는 것을 항상 보장해야합니다. 즉 당신이 CHERRYs에있는 경우가 동일한 개체를 보장하고 있기 때문에

if (symbol == CHERRY) 

대신

if (symbol.equals(CHERRY)) 

의 할 수 있습니다. 당신을 생각 new없이

Symbols t = new Symbols(s); 

: 음이, 생성자 만 호출

public class Suit { 
    private final String name; 

    public static final Suit CLUBS =new Suit("clubs"); 
    public static final Suit DIAMONDS =new Suit("diamonds"); 
    public static final Suit HEARTS =new Suit("hearts"); 
    public static final Suit SPADES =new Suit("spades");  

    private Suit(String name){ 
     this.name =name; 
    } 
} 
2

당신이 new 키워드를 호출이 더 것입니다

Typesafe Enum 패턴의 강화 버전 일 수 있습니다 'Symbols'이라는 메서드를 호출하려고합니다.

그러나 상수 정의 외부에서 열거 형을 인스턴스화 할 수 없으므로이 경우에는 관계가 없습니다. 가능한 경우 열거 형이 아닙니다.

에 열거 형 복사본이 있어야하는 이유를 알아 봅시다. 복사본이 필요하면 열거 형이 상태 유지라는 것을 말하고 있기 때문에 반드시 필요합니다. 사실이 아니어야합니다. 열거 형은 변경 불가능해야합니다.그리고 그것들은 변경 될 수 없으므로 어디에서나 인스턴스를 공유 할 수 있습니다.

0

열거 형은 새 개체를 만들 수없는 클래스입니다. 따라서 Symbol 클래스 (enum)에는 6 개의 인스턴스 만 있습니다. enum 생성자는 호출 할 수 없지만 6 개의 인스턴스에 대해 생성 된 참조 사본을 가질 수 있습니다.

Symbols s = Symbols.CHERRY; //Get a copy of reference for instance CHERRY 

반면에 Java에서 생성자의 키가 크면 키워드 "new"를 사용해야합니다.

1

당신은 다음과 같이 열거 뭔가를 사용

public enum Symbols { 
    SEVEN(12,"images/seven.jpg"), 
    WATERMELON(10,"images/watermelon.jpg"); 

    private int payout; 
    private String icon; 

    Symbols(int payout, String icon){ 
     this.payout = payout; 
     this.icon = icon; 
    } 

    public int getPayout(){ 
     return this.payout; 
    } 

    public String getIcon(){ 
     return this.icon; 
    } 
    public static void main(String[] args){ 
     System.out.println(Symbols.SEVEN.getPayout()); 
    } 
} 

다른 답변은 복사 생성자를 가질 수없는 이유에 좋은 설명을했다. 기본적으로 열거 형 클래스의 "인스턴스"(일곱 번째 및 수 열등)는 변경할 수 없으므로 런타임에 다른 값을 지정할 수 없으므로 새 값을 만들 수 없습니다.

관련 문제