Вопрос по Java перечислениям - PullRequest
4 голосов
/ 25 февраля 2009

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

Решением было определить перечисление в обоих файлах, но мне это не кажется правильным. Это не только избыточно, но я боюсь, что это может вызвать конфликт, даже если типы имеют одинаковые элементы.

Что это за вердикт? Я делаю что-то не так или слишком беспокоюсь?

EDIT

Ну, учитывая комментарии здесь, я нашел альтернативу, которая, кажется, делает то, что я хочу, без необходимости создавать новый файл. У меня было:

файл 1

class myClass1
{
    public enum MyEnum
    {
        ...
    }
    ...
}

файл 2

class myClass2
{
    public enum MyEnum
    {
        ...
    }
    ....
}

Теперь у меня есть:

файл 1

enum myEnum
{
    ...
}

...

class myClass1
{
     ...
}

файл 2

class myClass2
{
     ...
}

Я не хотел создавать другой файл только для перечисления, так что это работает для меня. Ну, пока в этом нет ничего плохого, а я думаю, что нет.

Ответы [ 4 ]

12 голосов
/ 25 февраля 2009

Вы определенно не должны определять enum в обоих местах. Я рекомендую определить перечисление в своем собственном файле с общедоступной доступностью. Тогда у всех не должно быть проблем с доступом к нему. Однако, предполагая, что вы хотите определить перечисление в одном из двух классов, я продолжу ...

Вы должны import перечислить или использовать его полностью определенное имя. Предполагая, что вы находитесь в пакете com.stackoverflow, ваши классы должны выглядеть следующим образом, в первом файле:

package com.stackoverflow;

public class A {
    public enum MyEnum {
      ONE,TWO,THREE;
    }

    ...
}

и в другом файле:

package com.stackoverflow;

import com.stackoverflow.A.MyEnum;

public class B {

  public void test(MyEnum mine) {
    ...
  }

  ...
}
3 голосов
/ 25 февраля 2009

Нет - это неправильно. enum может быть объявлен как статический внутренний класс и на него можно ссылаться, используя полное имя

public class MyClass {
    public static enum MyEnum { BOOK, DVD }


    public void myMethod() {
        MyEnum e = MyEnum.DVD;
    }
}


public class B {
    public void someMethod() {
        MyClass.MyEnum enumVal = MyClass.MyEnum.BOOK;
    }
}
1 голос
/ 25 февраля 2009

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

0 голосов
/ 25 февраля 2009

Вы определяете свои перечисления так же, как вы определяете классы - либо в их собственном файле, либо как статические внутренние классы (они должны быть статическими, чтобы не быть привязанными к своему классу включения).

Определение вашего enum в 2 файлах не работает, так как это своего рода поражение цели - у вас будет 2 отдельных перечисления, и хотя вы захотите проверить равенство в Enum.A, у вас действительно будет Enum1.A! = Enum2.A. Очень запутанно.

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

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