java - вопрос перечисления - PullRequest
0 голосов
/ 26 июня 2011

Я столкнулся со странной проблемой в своем приложении (Java).

У меня есть enum.Что-то в этом роде

public enum myEnum implement myIntrface{
   valueA(1),valueb(2),valuec(3),valued(4)
   private int i;
   // and then - a constructor 
   public MyEnum(int number){
        i = number;
   }       


   private MyObj obj = new MyObj;
   // getter and setter for obj
} 

и в другом классе у меня это

   MyEnum.valueA.setObj(new Obj(...))

в кратком изложении - у меня есть enum с частным экземпляром, у которого есть set и get.

Пока все хорошо -

Единственное, что меня поражает, это то, что позже я смотрю на значение MyEnum.valueA (). Obj равно нулю.

нет ничего, что изменяет значение на ноль, я даже дал ему значение по умолчанию в конструкторе, и я все еще вижу его нулевым.
какие-либо предложения?

Ответы [ 4 ]

1 голос
/ 26 июня 2011

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

public final class Connection {

    public static final Connection EMAIL = new Connection("email");
    public static final Connection PHONE = new Connection("phone");
    public static final Connection FAX = new Connection("fax");
    /**/
    private final String unmodifiableName; //<-- it's final
    private String modifiableName;

    /*
     * The constructor is private so no new connections can be created outside.
     */
    private Connection(String name) { 
        this.unmodifiableName = name;
    }

    public String getUnmodifiableName() {
        return unmodifiableName;
    }

    public String getModifiableName() {
        return modifiableName;
    }

    public void setModifiableName(String modifiableName) {
        this.modifiableName = modifiableName;
    }

}
0 голосов
/ 27 июня 2011

причиной этой проблемы является структура db40.Он загружает перечисление из БД, используя отражение.Это хорошо задокументировано.
http://developer.db4o.com/Forums/tabid/98/aft/5439/Default.aspx

0 голосов
/ 26 июня 2011

Для справки следующий код работает как положено:

public class Test {

    public static enum MyEnum {
        valueA(1),valueb(2),valuec(3),valued(4);
        private int i;
        private Object o;

        private MyEnum(int number) {
             i = number;
        }

        public void set(Object o) {
            this.o = o;
        }

        public Object get() {
            return o;
        }


     } 

    public static void main(String[] args) {
        System.out.println(MyEnum.valueA.get());  // prints "null"
        MyEnum.valueA.set(new Integer(42));
        System.out.println(MyEnum.valueA.get());  // prints "42"
    }
}
0 голосов
/ 26 июня 2011

Целью перечислений является представление постоянных значений.Не имеет смысла устанавливать поля с постоянным значением.

Вы должны объявить свои поля как final и использовать конструктор для инициализации всех из них.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...