Рубрики
Без рубрики

Создайте свое ПЕРЕЧИСЛЕНИЕ (да, с Java’)

Если вы всегда в восторге от простых, но мощных перечислений на java, следуйте за ними;) На Яве перечисление… С тегами java, перечисление, интервью, учебник.

Java DIY (Серия из 2 частей)

Если вы всегда в восторге от простых, но мощных перечислений на java, следуйте за ними;)

В Java перечисление тип данных внутренне наследуется от java.lang. Перечисление класс.

Варианты использования для рассмотрения:

  • должны быть методы имя(), порядковый номер() как окончательный который никто не может отменить
  • всегда поддерживайте одноэлементный статус для каждого значения перечисления
  • вы не должны иметь доступа к конструктору перечисления (сделайте его закрытым)
  • должен иметь порядковый номер (рассмотрим идею последовательной нумерации)
  • перечисление должно иметь значения() , которое возвращает все значения перечисления.

Я написал простую, но довольно полную реализацию, поэтому я приветствую любые отзывы.

import java.util.List;

abstract class EnumBase implements Comparable, Serializable {

    private final int ordinal;
    private final String name;

    protected EnumBase(int ordinal, String name) {
        this.ordinal = ordinal;
        this.name = name;
    }

    public final int ordinal() {
        return ordinal;
    }

    /**
     * non overridable
     *
     * @return always gives ENUM Constant name
     */
    public final String name() {
        return name;
    }

    /**
     * It is desired to be overloaded
     *
     * @return default to enum constant name
     */
    @Override
    public String toString() {
        return name;
    }

    @Override
    public final boolean equals(Object o) {
        return o == this;   // as singleton always yield true
    }

    @Override
    public final int hashCode() {
        return super.hashCode();    // don't need it as there can only be ONE instance on an Enum
    }

    @Override
    public final int compareTo(EnumBase o) {
        return Integer.compare(o.ordinal, ordinal);
    }

    /**
     * This guarantees that enums are never cloned, which is necessary
     * to preserve their "singleton" status.
     */
    protected final Object clone() throws CloneNotSupportedException {
        throw new CloneNotSupportedException();
    }

    /**
     * prevent default deserialization
     */
    private void readObject(ObjectInputStream in) throws IOException,
            ClassNotFoundException {
        throw new InvalidObjectException("can't deserialize enum");
    }

    private void readObjectNoData() throws ObjectStreamException {
        throw new InvalidObjectException("can't deserialize enum");
    }
}

public class MyEnum {
    private static int ordinalCounter = 0;

    /**
     * Utility class where we fix the ordinal as sequential integers
     */
    private abstract static class AbstractEnum extends EnumBase {
        private AbstractEnum(String name) {
            super(++ordinalCounter, name);
        }
    }

    // singleton instance
    public static final FIRST FIRST = new FIRST();

    static class FIRST extends AbstractEnum {
        private FIRST() {
            super(FIRST.class.getSimpleName());
        }
    }

    public static final SECOND SECOND = new SECOND();

    static class SECOND extends AbstractEnum {
        private SECOND() {
            super(SECOND.class.getSimpleName());
        }
    }

    public static List values() {
        return List.of(FIRST, SECOND);
    }
}

class MyEnumDriver {
    public static void main(String[] args) {
        // FIRST 1
        System.out.println(MyEnum.FIRST.name() + " " + MyEnum.FIRST.ordinal());
        // true
        System.out.println(MyEnum.FIRST == MyEnum.FIRST);
        // FIRST 2
        System.out.println(MyEnum.SECOND.name() + " " + MyEnum.SECOND.ordinal());
        // values
        System.out.println(MyEnum.values());
    }
}


Java DIY (Серия из 2 частей)

Оригинал: “https://dev.to/saurabhpro/my-enum-yes-from-java-a89”