2017-04-04 53 views
2

我在一個類中使用「標誌」接口。讓我們把它叫做java中的嵌套接口

public interface Flags 

我希望能夠實現與對象的標誌接口,並擁有繼承的所有,我把它分旗。例如

public interface Flags{ 
    static int flag1 = 0; 

    public interface Size{ 
     public static int big = 1; 
     public static int small = 2; 

    public interface Direction{ 
     public static int left = 3; 
     public static int right = 4; 

所以,我要的是有對象的Foo落實旗類

public class Foo implements Flags{} 

,並獲得所有的子標誌(即左,右,大,小,FLAG1)。

但我也希望它讓我可以有Foo1實現規模和只能訪問大小標誌

public class Foo1 implements Flags.Size{} 

我發現這個Can we define an interface within an interface?這表明嵌套的接口是可能的,但我不知道如何以我期待的方式做到這一點。

我嘗試過簡單地做我正在尋找的東西,它變成了一個巨大的痛苦。 我的意思是,如果我想美孚訪問旗大,我會做以下

public class Foo implements Flags{ 
    final int size = Size.big; 
} 

這是很不理想。我更喜歡做以下的事情

public class Foo implements Flags{ 
    final int size = big; 
} 
+0

您可能會混淆接口的概念和類的概念。一個接口承諾一定的行爲,所以實現它的任何東西都必須定義這種行爲。但是你現在正在試圖定義字段,這是類的一個特性。但是,你可以嵌套課程! – Ishnark

回答

4

爲什麼你不使用枚舉這種行爲?你應該使用一個枚舉,因爲這些是靜態值enum tutorial

+0

雖然這是最有意義的,但我還沒有聽說過Enums對象。謝謝 –

0

使用接口來存儲常量被認爲是不好的做法(正如Joshua Bloch在Effective Java中指出的那樣),它們根本不是爲了達到這個目的而發明的。您應該考慮使用類的靜態成員用於此目的或枚舉。

但是,即使這不是一個壞習慣,這樣的事情也沒有任何意義。如果您的課程可以訪問該界面,那麼它也可以訪問其所有成員。

0

你爲什麼要嵌套接口?只是separetely聲明子接口,每一個在其單獨的源文件,然後從所有的子接口使您Flags接口繼承:

public interface Flags extends Size, Direction { 

    int flag1 = 0; 
} 

這將允許你做出Foo類實現您的Flags接口,從而繼承所有的領域,並且還將使您的Foo1類僅實現Size接口。

注意1:將接口成員聲明爲public沒有任何意義,因爲默認情況下它們都是公共的。對於static成員也是如此:如果成員不是方法,則它自動爲static。注2:正如其他人指出的那樣,使用接口來存儲常量被認爲是不好的做法。你應該使用枚舉。然而,我今天並不覺得自己是純粹主義者,而使用枚舉不會允許你之後的行爲,因爲枚舉不能被繼承。