Как использовать конструктор копирования enum в Java? - PullRequest
4 голосов
/ 26 октября 2011

Я пытаюсь завершить проект, и хотя я пытался, я не могу этого сделать.Вот перечисление:

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);
    }

Теперь я могу войти в main и создать символ с именем "s", например так:

Symbols s = Symbols.CHERRY;

Но у меня возникают проблемы при создании копии "s "с использованием данного конструктора копирования:

Symbols t = Symbols(s);

Если я пытаюсь сделать это, я получаю ошибку:" Метод Symbols (Символы) не определен для типа Symbols. "

Спасибо

Ответы [ 6 ]

4 голосов
/ 26 октября 2011

Ну, вы должны сделать это публичным, но оно все равно не сработает. В Java нет конструкторов копирования; вы не можете «новый» Enum, что является следующей ошибкой; и в любом случае Java делает все возможное, чтобы обеспечить наличие только одной копии каждого значения перечисления на JVM. Как вы думаете, для чего вам нужен конструктор копирования ?

Решение:

Symbols s = Symbols.CHERRY;
Symbols t = s;
2 голосов
/ 26 октября 2011

Ну, конструкторы вызываются только когда вы вызываете ключевое слово new:

Symbols t = new Symbols(s);

Без new он думает, что вы пытаетесь вызвать метод с именем Symbols.

Но это не имеет значения в этом случае, потому что вы не можете создать экземпляр enum вне константных определений. Если бы ты мог, это не было бы перечислением.

Давайте рассмотрим, почему вы хотели бы иметь копию перечисления. Если вам нужна копия, это обязательно потому, что вы говорите, что перечисление является состоянием, что не должно быть правдой. Перечисления должны быть неизменяемыми. И поскольку они должны быть неизменными, вы можете делиться экземплярами где угодно.

2 голосов
/ 26 октября 2011

перечисления должны быть неизменными - вы не должны создавать новые.И конструкторы применяются как частные (хотя и не помечены как таковые).

Поскольку они неизменяемы, от вас всегда должно быть гарантировано, что если у вас есть экземпляр объекта Symbols.CHERRY, это всегда один и тот же экземпляр, поэтому вы можете выполнять такие вещи, как тест на эквивалентность объекта вместо equals -то есть вы можете сделать

if (symbol == CHERRY) 

вместо

if (symbol.equals(CHERRY))

, потому что если вам нужно CHERRYs, они гарантированно будут одним и тем же объектом.

Это более предназначенобыть принудительной версией шаблона Typesafe Enum :

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;
    }
}
1 голос
/ 26 октября 2011

Вы используете ENUM примерно так:

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());
    }
}

Другие ответы дали хорошее объяснение того, почему у вас не может быть конструкторов копирования.По сути, «экземпляры» (SEVEN и WATERMELON) вашего класса enum являются неизменяемыми, поэтому вы не можете указывать внутри них никакие другие значения во время выполнения и не можете создавать новые.

0 голосов
/ 26 октября 2011

Enum - это классы, которые не позволяют создавать новые объекты.Таким образом, ваш класс Symbol (enum) имеет только шесть экземпляров.Вы не можете вызвать конструктор enum, но у вас может быть копия ссылок, созданная для шести экземпляров.

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

С другой стороны, если вы хотите получить высокий конструктор в Java, вам нужно использоватьключевое слово "новый".

0 голосов
/ 26 октября 2011

перечисления не являются нормальными классами. Вы не можете вручную построить их. сам по себе enum «класс» в основном является «абстрактным» классом. каждое значение реализовано в виде отдельного конкретного подкласса перечисления «класс».

...