在Java中,是否可能在接口内部有一个内部类?
你可以这样做。但这是O'Reilly对此的说法:
Java支持在接口中定义嵌套类,其语法和动态特性与在类中声明的嵌套类相同。然而,在接口内部声明一个类将是极其糟糕的编程实践。接口是概念的抽象,而不是实现。因此,实现细节应该留在接口之外。记住,仅仅因为你可以用锯子砍掉你的手并不意味着这是一个特别好的想法。
话虽如此,我可以理解一个静态实用工具类嵌套到一个接口中的论点。尽管为什么它需要嵌套到接口中而不是作为独立的类完全是主观的。
我同意这应该是一种普遍很少用到的方式,但是当接口方法需要返回多个信息时,我喜欢在服务中使用内部类,因为它确实是契约的一部分而不是实现。例如:
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...
}
}
是的,这是可能的,但这不是常见的做法。
interface Test
{
class Inner
{ }
}
class TestImpl implements Test
{
public static void main(String[] arg)
{
Inner inner = new Inner();
}
}
虽然没有直接回答你的问题,但是在相关的话题上,你也可以将一个接口嵌套在另一个接口中。这是可以接受的,特别是如果你想提供视图。例如,Java的集合类就是这样做的,比如Map.java
中的Map.Entry
视图:
public interface Map<K,V> {
...
public static interface Entry<K,V> {
....
}
}
这是可以接受的,因为您没有将实现细节混合到接口中。您只是指定了另一个契约。
Entry<K, V>
接口在 Map<K, V>
之外并不实用,只有在 Map<K, V>
中使用(因为它是地图的视图)。我可以看到定义一个通用的 KeyValuePair<K, V>
接口,但可能会被滥用来保存两个不一定相关的任意值,所以也许这就是将其范围限定在 Map<K, V>
接口中的原因。 - Vivin Paliath这是合法的,但我只在嵌套接口(如前所述)或嵌套枚举中使用它。例如:
public interface MyInterface {
public enum Type { ONE, TWO, THREE }
public Type getType();
public enum Status { GOOD, BAD, UNKNOWN }
public Status getStatus();
}
我发现这个非常有用的一种情况是,如果您有一个创建接口实例的构建器。如果构建器是接口的静态成员,则可以像这样创建一个实例:
DigitalObject o = new DigitalObject.Builder(content).title(name).build();