2015-10-16 55 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節 「字段(恆定)聲明」:

在接口的身體的每個字段聲明是隱含publicstatic,和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沒錯,但它不是「它爲什麼要成爲」的問題,它是「什麼是語義」的問題,答案是:它們是常量。 – Andreas

2

我稱之爲反模式。接口用於使用方法定義合同。在提供的接口中,它似乎被用於全局變量的目的。

從邏輯上講,接口具有屬性/屬性沒有意義,類應該用於具有屬性和操作的實體。這可以使用類和靜態導入來達到相同的目的。

+0

Java不支持多重繼承,但允許一個類符合多個接口。這看起來像一個解決方法嗎? –

相關問題