2015-10-16 6 views
2

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

interface Literals { 
    /** 
    * The meta object literal for the '{@link bowling.impl.PlayerImpl <em>Player</em>}' class. 
    * <!-- begin-user-doc --> 
    * <!-- end-user-doc --> 
    * @see bowling.impl.PlayerImpl 
    * @see bowling.impl.BowlingPackageImpl#getPlayer() 
    * @generated 
    */ 
    EClass PLAYER = eINSTANCE.getPlayer(); 

    /** 
    * The meta object literal for the '<em><b>Name</b></em>' attribute feature. 
    * <!-- begin-user-doc --> 
    * <!-- end-user-doc --> 
    * @generated 
    */ 
    EAttribute PLAYER__NAME = eINSTANCE.getPlayer_Name(); 

    /** 
    * The meta object literal for the '<em><b>Date Of Birth</b></em>' attribute feature. 
    * <!-- begin-user-doc --> 
    * <!-- end-user-doc --> 
    * @generated 
    */ 
    EAttribute PLAYER__DATE_OF_BIRTH = eINSTANCE.getPlayer_DateOfBirth(); 
} 

ответ

3

Короткий ответ: Константы.

Цитирование Java Language Specification, раздел 9 "Интерфейсы", подраздел 9.3 "Field (Constant) Объявления":

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

Указание неявные модификаторы будут одинаковыми, но, возможно, прояснять его:

interface Literals { 
    public static final EClass PLAYER = eINSTANCE.getPlayer(); 
    public static final EAttribute PLAYER__NAME = eINSTANCE.getPlayer_Name(); 
    public static final EAttribute PLAYER__DATE_OF_BIRTH = eINSTANCE.getPlayer_DateOfBirth(); 
} 
+0

Да, но это не говорит, почему это должен быть интерфейс. В вашем примере это все равно может быть классным литералом. Они могли бы написать публичный статический окончательный а также ^^ – Friwi

+1

@Friwi True, но это был не вопрос «почему это должно быть», это вопрос «что такое семантика», на что ответ: они константы. – Andreas

2

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

Логически, для интерфейса не имеет смысла иметь свойства/атрибуты, классы должны использоваться для объекта с атрибутами и операциями. Это можно сделать, используя класс и статический импорт для той же цели.

+0

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

 Смежные вопросы

  • Нет связанных вопросов^_^