2009-02-25 5 views
3

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

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

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

EDIT

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

файл 1

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

файл 2

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

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

файл 1

enum myEnum 
{ 
    ... 
} 

... 

class myClass1 
{ 
    ... 
} 

файл 2

class myClass2 
{ 
    ... 
} 

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

+0

Образец образца пожалуйста? –

+0

Этот код будет работать до тех пор, пока перечисление не должно быть общедоступным. –

+0

Он делится только между обоими классами, поэтому я думаю, что это не обязательно. –

ответ

11

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

Вы должны указать 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) { 
    ... 
    } 

    ... 
} 
+0

В качестве альтернативы вы можете написать «import com.stackoverflow.A;» и «test (A.MyEnum mine)» –

+0

Хотя в этом примере A и B находятся в одном пакете, поэтому импорт не требуется. Просто напишите «A.MyEnum». –

+0

Должен ли MyEnum быть объявлен статическим? –

3

Нет - это неправильно. 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; 
    } 
} 
+0

Перечисления неявно статичны, когда они объявляются как классы-члены, так же, как интерфейсы неявно статичны, поэтому вам не нужно использовать ключевое слово «статическое». Просто сделайте это публично. –

+0

Да - я добавил статическое ключевое слово в одном из моих правлений; подумал, что может быть немного яснее, чтобы он был явным –

0

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

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

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

1

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