java中的嵌套接口

时间:2017-04-04 18:57:47

标签: java interface nested

我在课堂上使用“Flags”的界面。让我们称之为

public interface Flags

我希望能够使用对象实现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实现Flags类

public class Foo implements Flags{}

并且可以访问所有子标志(即left,right,big,small,flag1)。

但我也想要它,以便我可以让Foo1实现Size并且只能访问Size标志

public class Foo1 implements Flags.Size{}

我发现这个Can we define an interface within an interface?表明嵌套接口是可能的,但我不知道如何以我正在寻找的方式做到这一点。

我已经尝试过简单地做我正在寻找的东西,它变成了巨大的痛苦。 我的意思是,如果我想让Foo访问大旗,我将不得不做以下

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

这远非理想。我更愿意做以下

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

3 个答案:

答案 0 :(得分:4)

为什么不使用Enums进行此行为?您应该为此使用枚举,因为它们是静态值enum tutorial

答案 1 :(得分:0)

使用接口来存储常量被认为是一种不好的做法(正如Joshua Bloch在Effective Java中指出的那样),它们并不是为了达到这个目的而发明的。您应该考虑为此目的使用静态类成员或枚举。

然而,即使这不是一个不好的做法,这样的事情也没有任何意义。如果您的类可以访问该接口,则它还可以访问其所有成员。

答案 2 :(得分:0)

为什么要嵌套接口?只需在每个源文件中单独声明子接口,然后使Flags接口继承所有子接口:

public interface Flags extends Size, Direction {

    int flag1 = 0;
}

这将允许您使Foo类实现您的Flags接口,从而继承所有字段,并且还允许您使Foo1类仅实现Size类1}} interface。

注1:将接口成员声明为public没有任何意义,因为默认情况下它们都是公共的。对于static成员也是如此:如果成员不是方法,那么它将自动static

注2:正如其他人所指出的,使用接口存储常量被认为是不好的做法。你应该使用枚举。但是,我今天感觉不像是纯粹主义者,使用枚举不会允许你所遵循的行为,因为枚举不能被继承。