Как я могу использовать enum для замены нескольких полей? Как я могу передать эти значения в интерфейс? - PullRequest
0 голосов
/ 10 сентября 2010

У меня есть класс, в котором 4 поля, которые мне нужно установить и получить. Я должен использовать сеттеры и геттеры, но вместо обычных полей я должен использовать перечисление. Эта концепция смущает меня - рассмотрение полей не обязательно является константой. Я приведу пример

Если мы назовем класс Bear, 4 поля могут быть: имя, тип, никнейм, homeZoo. Обратите внимание, что все поля одного типа.

Мне нужно иметь методы setname (string) getname () и т. Д.

Помимо путаницы с enum, я также должен быть в состоянии передать заданное значение одного из полей в интерфейс - должен ли я реализовать интерфейс на медвежьем? Или есть какой-то способ присвоить значение методу в interfeace, поскольку enum является общедоступной статической конечной вещью.

Ваша помощь приветствуется!

Ответы [ 2 ]

0 голосов
/ 27 января 2015

перечисления, как правило, не могут заменить несколько полей.

Они используются, чтобы попытаться заставить аргумент метода (или аналогичного) принять только определенные предварительно определенные значения.

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

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

Классическими примерами перечислений являются игральные карты.

enum Colour{BLACK , RED}
enum Rank{A,2,3,4,5,6,7,8,9,10,J,Q,K}
enum Suit{SPADES,HEARTS,CLUBS,DIAMONDS}

Карта с рангом вне вышеуказанногоограниченный набор не имеет смысла.Таким образом, enum может использоваться для его представления.

Вы можете объявить интерфейс

interface CheckSuit
{
    public boolean checkSuit( Suit suit );
}

и класс, который его реализует.

class CheckSpade implements CheckSuit
{
    public boolean checkSuit( Suit suit )
    {
        return ( suit == Suit.SPADES );
    }
}

и некоторый код, которыйиспользует это.Здесь мы объявляем suitChecker экземпляром интерфейса CheckSuit, и после назначения его новым CheckSpade мы можем взаимодействовать с ним только полиморфно как CheckSuit.Мы не знаем, что это такое (по крайней мере, без использования instanceof или аналогичного)

CheckSuit suitChecker = new CheckSpade();
Suit s = Suit.SPADES;
Suit d = Suit.DIAMONDS;
System.out.println( "s: " + suitChecker.checkSuit( s ) );
System.out.println( "d: " + suitChecker.checkSuit( d ) );
0 голосов
/ 10 сентября 2010

Это не ответ, но я не смог уместить его в комментарии. Возможно, это поможет вам уточнить ваш вопрос, если ничего другого.

Классы обычно делают что-то другое в вашей реализации, чем другие классы. Например, если у вас есть класс Bear, вы ожидаете, что он будет делать что-то отличное от класса Dog (собака может вилять, может быть, медведь может заряжать).

Если, однако, вы просто отслеживаете медведей в зоопарке и также отслеживаете львов, то, вероятно, вам нужен класс Animals, который содержит «Bear» или «Lion» в качестве поля.

Теперь, в этом случае, Медведь и Лев могут быть перечислениями, хранящимися в классе Животных, чтобы сказать, каким видом зверя является животное. Это то, что вы хотели? Если это так, у вашего класса Animal будет setBreed, а вашим перечислением будет Breed {Bear, Lion, ...}.

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