Можно ли создать пустой тип перечисления Java с методами? - PullRequest
9 голосов
/ 06 сентября 2011

Я могу создать пустой тип перечисления Java, но когда я хочу добавить несколько методов: я получаю «синтаксическую ошибку» (в Eclipse). Я не нашел официальной документации по этому поводу, поэтому мой вопрос: это просто невозможно (так, где это явно упоминается?) Или это просто компилятор, который не так?

Ответы [ 4 ]

16 голосов
/ 06 сентября 2011

Да, это возможно.Вам просто нужно добавить ;, чтобы завершить (пустой) список констант перечисления:

enum TestEnum {
    ;                         // doesn't compile without this.
    public void hello() {
        System.out.println("Hello World");
    }
}

Определение синтаксиса JLS для enum s

(Обратите внимание, что без каких-либо экземпляров вы сможете вызывать только методы static в Enum.)

Связанные:

6 голосов
/ 15 февраля 2013

Конечно можно! «Да! Да! Ктулху Фтхагн! Ph'nglui mglw'nfah Ктулху Р'лех вгх'нагл фхтагн !!»

Оригинальная идея: "http://www.theserverside.com/news/thread.tss?thread_id=50190"

Уничтожьте реальность на свой страх и риск.

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

enum ThingsThatShouldNotBe {
;
public void HelloWorld() {
    System.out.println(this.name() + " Says Hello!");
}
public static void main(String[] args) throws Exception {
    Constructor<?> con = ThingsThatShouldNotBe.class.getDeclaredConstructors()[0];
    Method[] methods = con.getClass().getDeclaredMethods();
    for (Method m : methods) {
        if (m.getName().equals("acquireConstructorAccessor")) {
            m.setAccessible(true);
            m.invoke(con, new Object[0]);
        }
    }
    Field[] fields = con.getClass().getDeclaredFields();
    Object ca = null;
    for (Field f : fields) {
        if (f.getName().equals("constructorAccessor")) {
            f.setAccessible(true);
            ca = f.get(con);
        }
    }
    Method m = ca.getClass().getMethod("newInstance",
        new Class[] { Object[].class });
    m.setAccessible(true);
    ThingsThatShouldNotBe v = (ThingsThatShouldNotBe) m.invoke(ca, new Object[] { new Object[] { "Cthulhu",
            Integer.MAX_VALUE } });
    System.out.println(v.getClass() + ":" + v.name() + ":" + v.ordinal());
    System.out.println("Say hello Cthulhu!");
    v.HelloWorld();
}
}

Мву ХА ХА ХА ХА ХА ХА.

Если вам действительно нужен Enum, и вы хотите, чтобы у него были методы экземпляра, и вы решили призвать старших богов отражения, чтобы навязать миру эту мерзость, тогда это полезно .

Это определенно запутает других разработчиков позже.

5 голосов
/ 06 сентября 2011

Да, это:

Вам нужно добавить точку с запятой (;), чтобы завершить пустой список перечислений.
Это скомпилировано:

public enum MyEnum {
    ;
    public void method() {

    }
}

Хотя яне могу думать, для чего это было бы полезно.

1 голос
/ 06 сентября 2011

Absoulely,

/**
 * @author The Elite Gentleman
 * @since 06 September 2011
 *
 */
public enum ExampleEnum {
    WHAT_ENUM
    ;

    public void doOperation() {

    }
}

Позже:

ExampleEnum exEnum = ExampleEnum.WHAT_ENUM;
exEnum.doOperation();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...