Можно ли как-то enum XXX extends YYY?
От: dims12 http://www.relativity.ru
Дата: 29.05.07 00:15
Оценка: 2 (1)
Можно ли что-то такое сделать с классом enum, как-то его расширить? Например, добавить туда элементы в производном enume?

Например


enum BinaryDigit {
   zero,
   one
}

enum OctalDigit prolongates BinaryDigit {
   two,
   three,
   four,
   five,
   six,
   seven
}
Re: Можно ли как-то enum XXX extends YYY?
От: Blazkowicz Россия  
Дата: 29.05.07 04:27
Оценка:
Здравствуйте, dims12, Вы писали:

D>Можно ли что-то такое сделать с классом enum, как-то его расширить? Например, добавить туда элементы в производном enume?


Нельзя.
Re: Можно ли как-то enum XXX extends YYY?
От: Аноним  
Дата: 29.05.07 07:06
Оценка:
Здравствуйте, dims12, Вы писали:

D>Можно ли что-то такое сделать с классом enum, как-то его расширить? Например, добавить туда элементы в производном enume?


возможно появится в java 7
Re: Можно ли как-то enum XXX extends YYY?
От: Zuka Россия  
Дата: 29.05.07 07:40
Оценка:
Здравствуйте, dims12, Вы писали:

Нельзя. И вообще это нарушение LSP.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: Можно ли как-то enum XXX extends YYY?
От: dshe  
Дата: 29.05.07 13:38
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, dims12, Вы писали:


D>>Можно ли что-то такое сделать с классом enum, как-то его расширить? Например, добавить туда элементы в производном enume?


А>возможно появится в java 7


ссылки?
--
Дмитро
Re[3]: Можно ли как-то enum XXX extends YYY?
От: Blazkowicz Россия  
Дата: 29.05.07 13:45
Оценка: 1 (1)
Здравствуйте, dshe, Вы писали:

А>>возможно появится в java 7

D>ссылки?

Closed, will not be fixed.
Если кто-то на что-то в Java 7 надеется, это ведь совсем не значит что оно там появится.
Re: Можно ли как-то enum XXX extends YYY?
От: aefimov Россия
Дата: 29.05.07 20:30
Оценка: 1 (1) +1
Здравствуйте, dims12, Вы писали:

D>Можно ли что-то такое сделать с классом enum, как-то его расширить? Например, добавить туда элементы в производном enume?


Ну хоть и нельзя, но можно
Только вот, в консерваторииб чегонить не сломалось от таких раскладов.

Ведь Enum — это что? Это перечисление констант. Собранных вместе. Им можно даже конструктор и методы определить, если очень хочется, этим константам. Считайте, что это инлайн b]final[/b] class. Как "экстендить" final классы, я думаю все и так знают.

Теперь по существу. Что такое наследование? Это когда вы передаете наследнику логику и нестатические данные. Впрочем, наследник может мутировать. Статические данные привязываются к своему хозяину раз и навсегда, и соответственно, не наследуются вообще. Да вы можете обращаться к статик полям через класс потомка, но это не есть хорошо. Почему не есть хорошо? Потому, что если вы обрашаетесь к статик полю класса A через класс B, который extends A, то вы достигаете своей цели ровно до тех пор, пока кто-нибудь не определит в классе B статическое поле с точно таким же именем. Что-то я тут расписался Вообщем смысл один — к статическому полю обращаться надо всегда напрямую.

Если вы забудете слово enum, то сразу вспомните final class с final static полями, некий прототип Enum в более ранних версиях. Вам бы пришло в голову наследовать public static final поля?
Re[2]: Можно ли как-то enum XXX extends YYY?
От: bolshik Россия http://denis-zhdanov.blogspot.com/
Дата: 30.05.07 06:08
Оценка:
Здравствуйте, aefimov, Вы писали:


A>... Как "экстендить" final классы, я думаю все и так знают.


A>..


Не, я не знаю. Расскажи?
http://denis-zhdanov.blogspot.com
Re[2]: Можно ли как-то enum XXX extends YYY?
От: Eugeny__ Украина  
Дата: 01.06.07 15:56
Оценка: 9 (2)
Здравствуйте, aefimov, Вы писали:

На самом деле иногда все-таки было бу удобно наследовать енумы. Например, у меня очень много енумов вида:

enum BDPCashCodeStatus {
    IDLING(0x11), ACCEPTING(0x12), ESCROW(0x13), STACKING(0x14), VEND_VALID(0x15), STACKED(0x16),
    REJECTING(0x17), RETURNING(0x18), HOLDING(0x19), INHIBIT(0x1A), INITIALIZE(0x1B),
    POWERUP(0x40), POWERUP_WITH_BILL_IN_ACCEPTIOR(0x41), POWERUP_WITH_BILL_IN_STACKER(0x42),
    STACKER_FULL(0x43), STACKER_REMOVED(0x44), JAM_IN_ACCEPTOR(0x45), JAM_IN_STACKER(0x46), PAUSE(
            0x47), CHEATED(0x48), FAILURE(0x49), COMM_ERROR(0x4A), INVALID_COMMAND(0x4B);

    private final int value;

    BDPCashCodeStatus(int realValue) {
        this.value = realValue;
    }

    public char getValue() {
        return (char) value;
    }
}



Так вот задалбывает копипастить в каждом

        private final int value;

    <enumName>(int realValue) {
        this.value = realValue;
    }

    public char getValue() {
        return (char) value;
    }
Новости очень смешные. Зря вы не смотрите. Как будто за наркоманами подсматриваешь. Только тетка с погодой в завязке.
There is no such thing as a winnable war.
Re[3]: Можно ли как-то enum XXX extends YYY?
От: Lucker Беларусь http://lucker.intervelopers.com/
Дата: 02.06.07 11:56
Оценка: 12 (2)
Здравствуйте, Eugeny__, Вы писали:

E__>На самом деле иногда все-таки было бу удобно наследовать енумы. Например, у меня очень много енумов вида:


E__>
E__>enum BDPCashCodeStatus {
E__>    IDLING(0x11), ACCEPTING(0x12), ESCROW(0x13), STACKING(0x14), VEND_VALID(0x15), STACKED(0x16),
E__>    REJECTING(0x17), RETURNING(0x18), HOLDING(0x19), INHIBIT(0x1A), INITIALIZE(0x1B),
E__>    POWERUP(0x40), POWERUP_WITH_BILL_IN_ACCEPTIOR(0x41), POWERUP_WITH_BILL_IN_STACKER(0x42),
E__>    STACKER_FULL(0x43), STACKER_REMOVED(0x44), JAM_IN_ACCEPTOR(0x45), JAM_IN_STACKER(0x46), PAUSE(
E__>            0x47), CHEATED(0x48), FAILURE(0x49), COMM_ERROR(0x4A), INVALID_COMMAND(0x4B);

E__>


E__>Так вот задалбывает копипастить в каждом

А ты попробуй подойти с другой стороны. Если надо копипайстить — значит проблема с дублировнаием, от которого надо избавиться. Если нельзя избавиться наследованием, надо избавляться делегированием. Я вот заметил, что значения int value нужны в основном, когда нужно передать enum в другую среду (например, записать код в поле БД, или в <select> и так далее), и когда нужно преобразовать значение, полученное из этой среды в enum. А в нутри системы всегда используется сам енум. Выделил интерфейс, который описывает преобразование из значения в код и из кода в значение
public interface BidiConverter<V, C> {

    C thither(V value);

    V hither(C code);

}


Слделал тупую реализацию, которую конфигурирую в spring
    <bean id="model.PricingModel" class="iv.utils.convert.BidiEnumConverterFactoryBean">
        <property name="bidiMap">
            <map value-type="int">
                <entry key="CPM"    value="0"/>
                <entry key="CPA"    value="1"/>
                <entry key="CPC"    value="2"/>
                <entry key="TF"        value="3"/>
            </map>
        </property>
    </bean>


и для каждой внешней системы сделал адаптеры. Для hibernate UserType, для SpringMVC PropertyEditor и теперь все енумы в системе, за редкими исключениями, имеют вид
public enum model.PricingModel {
   CPM, CPA, CPC, TF
}
Blog
Re[4]: Можно ли как-то enum XXX extends YYY?
От: Eugeny__ Украина  
Дата: 04.06.07 08:39
Оценка:
Здравствуйте, Lucker, Вы писали:


L>А ты попробуй подойти с другой стороны. Если надо копипайстить — значит проблема с дублировнаием, от которого надо избавиться. Если нельзя избавиться наследованием, надо избавляться делегированием. Я вот заметил, что значения int value нужны в основном, когда нужно передать enum в другую среду (например, записать код в поле БД, или в <select> и так далее), и когда нужно преобразовать значение, полученное из этой среды в enum. А в нутри системы всегда используется сам енум.


Да, в моем случае это аппаратные коды устройства, которые посылаются непосредственно устройству, а на более высоком, "логическом" уровне драйвера, гораздо более удобны понятные enums.

L>Выделил интерфейс, который описывает преобразование из значения в код и из кода в значение

...

L>Слделал тупую реализацию, которую конфигурирую в spring

...

L>и для каждой внешней системы сделал адаптеры. Для hibernate UserType, для SpringMVC PropertyEditor и теперь все енумы в системе, за редкими исключениями, имеют вид

...

Решение интресное. Врядли я буду переписывать все существующие енамы, но все равно спасибо, может, потом сгодится.
Новости очень смешные. Зря вы не смотрите. Как будто за наркоманами подсматриваешь. Только тетка с погодой в завязке.
There is no such thing as a winnable war.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.