Безопасно ли клон передавать перечисление классов клону? - PullRequest
5 голосов
/ 17 января 2012

У меня есть простой класс, который содержит скелет для гораздо большего, более объемного класса.Весь этот скелет - это строковый идентификатор, перечисление типов и некоторые флаги для опций.

Я хотел бы иметь возможность клонировать этот скелет, но я не знаю, является ли перечисление безопасным для клонирования (мимозначение).Я думаю, что это не так, поскольку к ним относятся как к классам (передайте по ссылке).Безопасно ли просто передать перечисление в клон?

Пример для наглядности:

class A {
    String id;
    Enum state;
    int flags;

    A clone() {
        A ret = new A();
        ret.id = id;
        ret.state = state; // Am I safe here?
        ret.flags = flags;
        return ret;
    }
}

Ответы [ 2 ]

12 голосов
/ 17 января 2012

Экземпляр enum по определению является синглтоном. Существует только один экземпляр каждого экземпляра enum по своему замыслу. Очевидно, что единственное, что вы можете сделать, это скопировать ссылку.

5 голосов
/ 17 января 2012

JB Nizet правильный ответ.Но также, на всякий случай, если вы пытаетесь переопределить Object.clone(), учтите, что официальный способ клонирования объектов в Java выглядит примерно так:

class A implements Cloneable {
    String id;
    Enum state;
    int flags;

    public A clone() {
        A ret = (A) super.clone();
        ret.id = id;
        ret.state = state;  // Enum is a singleton, so this is ok
        ret.flags = flags;
        return ret;
    }
}

Обратите внимание, что вы должны вызвать(A) super.clone() вместо new A(), и что ваш класс должен реализовывать интерфейс Cloneable.

...