我知道在Java中,有人可以通過聲明public static final
來包含接口中的常量。但是,假設我有這樣一個接口,稱爲I
,它只包含公共靜態最終常量和方法簽名,以及一個名爲C
的類。我爲什麼要在C中實現I?即我爲什麼會做以下幾點:在接口中定義常量是什麼意思?
public class C implements I
由於常數是公開的,靜態的,不會我可以直接通過I
訪問它們?
我知道在Java中,有人可以通過聲明public static final
來包含接口中的常量。但是,假設我有這樣一個接口,稱爲I
,它只包含公共靜態最終常量和方法簽名,以及一個名爲C
的類。我爲什麼要在C中實現I?即我爲什麼會做以下幾點:在接口中定義常量是什麼意思?
public class C implements I
由於常數是公開的,靜態的,不會我可以直接通過I
訪問它們?
這個(反)模式非常有用。這曾經是一種常用的技術,但是現在您可以使用import static
來導入常數,就像它失寵一樣。其中的一個原因,以避免它是一組常量真的不是一個接口 - 它只是一個價值的一羣 - 而且使它的界面讓你做奇怪的事情就像寫
ConstantInterfaceWithNoMethods m = new ClassImplementingThatInterface;
或
if (m instanceof ConstantInterfaceWithNoMethods)
剛剛沒有意義在這方面。
希望這會有所幫助!
一般來說,你不需要。一個原因可能是,界面I
是一個「標記界面」。
什麼是「標記界面」? –
這是一個沒有任何方法的接口。不知道這個答案如何與OP的問題相關。 –
@ NathanSabruka-一個標記接口是一個類似於'Serializable'的接口,它沒有任何方法,只是作爲一個類有一些屬性的「標記」。自引入註釋以來,它們也失寵了。 – templatetypedef
這是一個可以讓你從界面訪問常量沒有遍地鍵入該接口的名稱Java的模式。這種模式早在enum
已經進入語言之前很多年了。
有些人認爲它有問題的,因爲它會導致創建不指定合同接口。因爲它可以讓你使用這些常量的名稱,而不必與I.
前綴他們
非常感謝解釋!我會盡快接受這個答案:) –