将类嵌套在接口中是一个好主意吗?

时间:2010-08-01 16:28:25

标签: java interface nested-class

是否有可能在java ???

中的接口内部有一个内部类

7 个答案:

答案 0 :(得分:3)

你可以。但这是O'Reilly所说的:

接口中的嵌套类?

Java支持接口中嵌套类的概念。语法和动态就像在类中声明的嵌套类一样工作。但是,声明嵌套在接口内的类将是非常糟糕的编程。接口是概念的抽象,而不是概念的实现。因此,实现细节应该省略接口。请记住,仅仅因为你可以用锯切断你的手并不意味着它是一个特别好的主意。


那就是说,我可以看到嵌套在接口中的静态实用程序类的参数。虽然为什么它需要嵌套到界面而不是一个独立的类是完全主观的。

答案 1 :(得分:2)

我同意这通常很少见,但我确实喜欢在接口方法需要返回多条信息时在接口中使用内部类,因为它实际上是合同的一部分而不是实现。例如:

public interface ComplexOperationService {

    ComplexOperationResponse doComplexOperation( String param1, Object param2 );

    public static class ComplexOperationResponse {
        public int completionCode;
        public String completionMessage;
        public List<Object> data;
        // Or use private members & getters if you like...
    }

}

显然,这也可以在一个单独的类中完成,但对我来说,感觉就像是将接口定义的整个API保存在一个位置,而不是分散开来。

答案 2 :(得分:1)

是的,这是可能的,但这不常见。

interface Test
{
    class Inner
    { }
}

class TestImpl implements Test
{
    public static void main(String[] arg)
    {
        Inner inner = new Inner();
    }
}

答案 3 :(得分:1)

不直接回答您的问题,但在相关说明中,您还可以将界面嵌套在另一个界面中。这是可以接受的,特别是如果您想提供视图。 Java的集合类执行此操作,例如Map.java视图中的Map.Entry

public interface Map<K,V> {
   ...
   public static interface Entry<K,V> {
       ....
   }
}

这是可以接受的,因为您没有将实现细节混合到您的界面中。你只是指定了另一份合同。

答案 4 :(得分:0)

是。直接从language spec

  

内部类是一个未显式或隐式声明static的嵌套类。

And(我的粗体字):

  

嵌套类是任何类,其声明发生在另一个类或接口的主体内。

答案 5 :(得分:0)

我觉得非常有用的一个用例是,如果你有一个构建器来创建一个Interface实例。如果构建器是Interface的静态成员,则可以创建如下实例:

DigitalObject o = new DigitalObject.Builder(content).title(name).build();

答案 6 :(得分:0)

这是合法的,但我只是使用嵌套接口(如前所述)或嵌套枚举来实现它。例如:

public interface MyInterface {

    public enum Type { ONE, TWO, THREE }

    public Type getType();

    public enum Status { GOOD, BAD, UNKNOWN }

    public Status getStatus();

}