Перечисления Java поддерживают методы?А не в с #? - PullRequest
5 голосов
/ 29 октября 2011

Я смотрю на этот код правильного способа создания синглтона в Java: Как эффективный способ реализовать шаблон синглтона в Java?

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

 public enum Elvis {
       INSTANCE;
       private final String[] favoriteSongs =
           { "Hound Dog", "Heartbreak Hotel" };
       public void printFavorites() {
           System.out.println(Arrays.toString(favoriteSongs));
       }
   }

И перечисление в коде выше, даже не имеет смысла для меня, у вас есть символ:

INSTANCE;

как это правильная строка?

Я пришел из c #, и этот синтаксис вызвал у меня любопытство, и я надеюсь, что кто-то может объяснить или разобраться в вышесказанном.

Я предполагаю, что это означает, что у java есть более чистое представление о перечислении, поскольку у него может быть поведение?

Ответы [ 3 ]

13 голосов
/ 29 октября 2011

Перечисление в Java на самом деле является классом. Тот, который неявно расширяет java.lang.Enum. Специальный синтаксис, который вы видите на INSTANCE;, является объявлением константы перечисления. Это будет использоваться для создания экземпляра вашего класса enum, на который можно ссылаться в коде. На самом деле, вы даже можете иметь конструктор не по умолчанию для вашего перечисления и использовать его в объявлении константы. Пример:

public enum Test {

    INSTANCE("testing");

    private final String content;
    public Test(final String content) {
        super();
        this.content = content;
    }

}

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

1 голос
/ 05 апреля 2015

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

enum Elvis
{
  Instance
}

static class ElvisExtension
{
  private static readonly string[] FavoriteSongs = { "Hound Dog", "Heartbreak Hotel" };

  public static void PrintFavorites(this Elvis singleton)
  {
    Console.WriteLine(string.Join(", ", FavoriteSongs));
  }
}

Использование:

Elvis.Instance.PrintFavorites();
1 голос
/ 29 октября 2011

Чтобы дать немного другой ответ, который, я думаю, вы спрашиваете, строка INSTANCE; в коде Java является эквивалентной строкой Instance в следующем примере C #:

enum Elvis
{
    Instance
}

Это способ создания value для Java enum.Далее в качестве примера можно привести перечисление Java:

public enum Gender {
    MALE,
    FEMALE;
}

Где типы значений Gender.MALE и Gender.FEMALE, что эквивалентно:

enum Gender
{
    Male,
    Female
}

в C #.

Если я отклонился от вашего вопроса, прошу прощения.

...