Java: Как можно использовать перегрузку конструктора в перечислениях? - PullRequest
4 голосов
/ 29 июля 2011

Я работаю с перечислениями в Java.Как я вижу, возможно перегрузить конструктор перечисления.Мой вопрос - возможно ли вообще выиграть от перегрузки конструктора в этом контексте, учитывая, что, насколько я понимаю, невозможно ни вызвать ее самостоятельно, ни заставить компилятор вызывать конкретную версию, которую вы хотели бы вызвать?

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

Ответы [ 5 ]

16 голосов
/ 29 июля 2011

Вы делаете вызов - при установке значений перечисления. Например:

public enum Person
{
    FRED("Frederick", "Fred"),
    PETE("Peter", "Pete"),
    MALCOLM("Malcolm"); // No nickname

    private final String nickname;
    private final String name;

    private Person(String name, String nickname)
    {
        this.name = name;
        this.nickname = nickname;
    }

    private Person(String name)
    {
        this(name, name); // Just use the name as the nickname too
    }

    // getNickname and getName
}

В прошлом я использовал эту способность для различных проектов. Перечисления являются одной из самых приятных функций Java - безусловно, одной из немногих вещей, которые мне не хватает в Java при работе в C #. (Я уверен, что они могли бы быть реализованы еще более аккуратно, но ...)

3 голосов
/ 29 июля 2011

Еще более полный пример:

public enum EnumTest {
  NO_ARGS, 
  FIRST_ARG("initialized string"), 
  SECOND_ARG(5), 
  BOTH_ARGS("first", Integer.MAX_VALUE);

  private final String one;
  private final int two;

  private EnumTest()
  {
    this.one = "";
    this.two = 2;
  }

  private EnumTest(String one)
  {
    this.one = one;
    this.two = 0;
  }

  private EnumTest(int two)
  {
    this.one = "";
    this.two = two;
  }

  private EnumTest(String one, int two)
  {
    this.one = one;
    this.two = two;
  }
}
2 голосов
/ 29 июля 2011

Вы используете конструктор, когда определяете enum "константы"

enum Eg {
   ZERO, ONE(1), TWO(2,2);

   Eg() { this(0); }
   Eg(int i) { this(i, 0); }
   Eg(int i, int j) { }
}
2 голосов
/ 29 июля 2011

Да, вы можете использовать перегрузку конструктора:

public enum SomeEnum {
  VALUE1("foo"),
  VALUE2("bar", "baz");

  public final String v1;
  public final String v2;

  SomeEnum(final String v) {
    this(v, v);
  }

  SomeEnum(final String v1, final String v2) {
    this.v1 = v1;
    this.v2 = v2;
  }
}
0 голосов
/ 25 октября 2013

Есть ли способ использовать конструктор для получения enum из его эквивалентного целочисленного значения? В настоящее время у меня есть такой код, но эта длинная инструкция переключения не очень лаконична.

ZoneGroup zoneGroup = ZoneGroup.get(loader.getId());

public static enum ZoneGroup {
    ANDROID_NOTABLE(0), ANDROID_TOP(1), ANDROID_ALL(2), ANDROID_NEAR(3), ANDROID_FAV(4), UNDEFINED(5);

    private final int value;

    ZoneGroup(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }

    public static ZoneGroup get(int value){
        switch (value) {
        case 0:
            return ANDROID_NOTABLE;
        case 1:
            return ANDROID_TOP;
        case 2:
            return ANDROID_ALL;
        case 3:
            return ANDROID_NEAR;
        case 4:
            return ANDROID_FAV;
        default:
            return UNDEFINED;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...