Может ли интерфейс потребовать, чтобы класс определил внутреннее перечисление? - PullRequest
1 голос
/ 23 июня 2011

Я хочу определить интерфейс, чтобы все реализующие его классы определяли внутреннее перечисление с именем Fields. Это возможно в Java?

РЕДАКТИРОВАТЬ : я создаю динамическое веб-приложение с использованием Java (Servlets / JSP). Я пытаюсь, чтобы у всех моих моделей были методы save(), чтобы они сохранялись в базе данных. Для представления данных и полей, скажем, пользователя в системе я хочу использовать Map<User.Fields, Object>. Но я хочу поместить метод save() в интерфейс, поэтому я хочу убедиться, что все сохраняемые объекты имеют перечисление Fields. Например, класс User может определять что-то вроде:

public class User {
    enum Fields { USERNAME, PASSWORD }
}

Ответы [ 4 ]

2 голосов
/ 23 июня 2011

Нет, вы не можете.

Почему бы не иметь перечисление в родительском интерфейсе.

РЕДАКТИРОВАТЬ, чтобы ответить на РЕДАКТИРОВАТЬ вопрос: Вы не должны делатькак это.Вместо этого создайте интерфейс, подобный следующему:

interface Saveable
{
    Object[] getSaveFields();
}

Просто найдите шаблон памятного подарка, он может вам помочь.

0 голосов
/ 23 июня 2011

нет, но вы можете сделать что-то вроде:

    enum E {
        e1,e2
    }
    interface I{
        Enum getEnum();
    }
 interface I2 {
    EnumSet getEnums();
}
class I2Impl implements I2 {
    @Override public EnumSet getEnums() {
        return EnumSet.allOf(E.class);
    }
}
public class Main {
    public static void main(String[] args) {
        System.out.println(new IImpl().getEnum());
        System.out.println(new I2Impl().getEnums());
    }
}
0 голосов
/ 23 июня 2011

Одна из техник, которую я использовал для решения этой проблемы, состоит в том, чтобы определить интерфейс с типом перечисления, чтобы вы могли «объединить» определенное перечисление с классом, а затем определить это перечисление с подклассом, например:

public interface MySuper<T extends Enum<T>> {
    void someMethod(T someEnum);
}

public class MySubClass implements MySuper<MyEnum> {

    public static enum MyEnum {
        ONE, TWO, THREE
    }

    void someMethod(MyEnum myEnum) {
        // do something
    }
}

Как ни странно, вам нужно import static mypackage.MySubClass.MyEnum;

0 голосов
/ 23 июня 2011

Как сказал Сурадж, нет, это невозможно. Каково ваше намерение этим, однако? Если каждый подкласс определяет свой собственный набор полей, вы можете вызвать метод getFields, возвращающий набор объектов, реализующих другой интерфейс (и / или Enum). Или просто по именам, вам нужен API рефлексии (то есть getClass (). GetDeclaredFields ())?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...