Реализация Runnable в Enum - PullRequest
       31

Реализация Runnable в Enum

0 голосов
/ 16 февраля 2020

Я просто играю с enum, и я хотел посмотреть, как он ведет себя в каком-то безумном сценарии ios. Ну, немногие java ботаники могут знать, что мы действительно можем реализовать интерфейс в Enums. Поэтому я придумал приведенный ниже код и хотел узнать, создан ли поток и вызван ли он. Мне любопытно, если кто-нибудь может объяснить, почему sysout не напечатан. Приведенный ниже код действителен, т.е. компилируется нормально и выполняется. Он просто ничего не печатает. Кто-нибудь может объяснить ясно?

Также, почему метод values ​​() не объявлен ни в классе Enum, ни в классе Object. Почему метод значений предоставляется компилятором java. Почему Солнце / Oracle не думает о реализации этого в классе Enum.

 package com.test;


  enum MyEnum implements Runnable{

      ENUM1,ENUM2,ENUM3;
      public void run() {

          System.out.println("Inside MyEnum"+Thread.currentThread().getName());
      }
}


public class EnumTesting {

    MyEnum en;

      public static void main(String[] args) {

    EnumTesting test = new EnumTesting();

          Thread t = new Thread(test.en);
        t.start();

    }
}

Ответы [ 2 ]

1 голос
/ 16 февраля 2020

Он просто ничего не печатает. Кто-нибудь может объяснить четко?

Обратите внимание, что вы не дали en значение. Следовательно, это null. Когда null передается в конструктор Thread, поток документируется , чтобы ничего не делать:

Параметры:

target - объект, метод run которого вызывается при запуске этого потока. Если ноль, этот класс run метод ничего не делает.

Вы можете сделать это вместо этого:

new Thread(MyEnum.ENUM1).start();

Почему Солнце / Oracle не думает реализовать его в классе Enum.

Я предполагаю, что values, если бы оно было в Enum<T>, должно быть abstract, но методы stati c не могут быть абстрактными.

1 голос
/ 16 февраля 2020

1) Поскольку test.en является нулем, вы никогда не инициализируете его.

2) Реализация значений () должна выполняться компилятором, поскольку тип массива является типом конкретного Enum, здесь MyEnum[]. Если он будет объявлен в классе Enum, он должен иметь тип возвращаемого значения Enum[].

...