我刚刚在我们的代码库中发现了一个静态嵌套接口。
class Foo {
public static interface Bar {
/* snip */
}
/* snip */
}
我以前从未见过这个。原来的开发人员已经找不到了。因此我不得不问SO:
静态接口背后的语义是什么?如果我移除这些静电,会发生什么变化?为什么会有人这么做?
我刚刚在我们的代码库中发现了一个静态嵌套接口。
class Foo {
public static interface Bar {
/* snip */
}
/* snip */
}
我以前从未见过这个。原来的开发人员已经找不到了。因此我不得不问SO:
静态接口背后的语义是什么?如果我移除这些静电,会发生什么变化?为什么会有人这么做?
当前回答
成员接口是隐式静态的。可以在不改变代码语义的情况下删除示例中的静态修饰符。请参见Java语言规范8.5.1。静态成员类型声明
其他回答
在Java中,静态接口/类允许接口/类像顶级类一样使用,也就是说,它可以由其他类声明。所以,你可以:
class Bob
{
void FuncA ()
{
Foo.Bar foobar;
}
}
如果没有静态,上述代码将无法编译。这样做的好处是,您不需要一个新的源文件来声明接口。它还可视化地将接口Bar与类Foo关联起来,因为你必须编写Foo。Bar并暗示Foo类对Foo.Bar的实例做一些事情。
Java中类类型的描述。
如果你将类Foo改为接口Foo,上面例子中的“public”关键字也将是多余的,因为
在另一个接口中定义的接口将隐式公开 静态的。
成员接口是隐式静态的。可以在不改变代码语义的情况下删除示例中的静态修饰符。请参见Java语言规范8.5.1。静态成员类型声明
Jesse's answer is close, but I think that there is a better code to demonstrate why an inner interface may be useful. Look at the code below before you read on. Can you find why the inner interface is useful? The answer is that class DoSomethingAlready can be instantiated with any class that implements A and C; not just the concrete class Zoo. Of course, this can be achieved even if AC is not inner, but imagine concatenating longer names (not just A and C), and doing this for other combinations (say, A and B, C and B, etc.) and you easily see how things go out of control. Not to mention that people reviewing your source tree will be overwhelmed by interfaces that are meaningful only in one class.So to summarize, an inner interface enables the construction of custom types and improves their encapsulation.
class ConcreteA implements A {
:
}
class ConcreteB implements B {
:
}
class ConcreteC implements C {
:
}
class Zoo implements A, C {
:
}
class DoSomethingAlready {
interface AC extends A, C { }
private final AC ac;
DoSomethingAlready(AC ac) {
this.ac = ac;
}
}
静态意味着包(项目)的任何类都可以在不使用指针的情况下访问它。根据情况,这可能是有用的,也可能是阻碍的。
“静态”方法的最佳示例是Math类。数学中的所有方法都是静态的。这意味着你不需要走出去,创建一个新的实例,声明变量并将它们存储在更多的变量中,你只需要输入你的数据并得到一个结果。
静态并不总是那么有用。例如,如果您正在进行案例比较,您可能希望以几种不同的方式存储数据。您不能创建三个具有相同签名的静态方法。你需要3个不同的实例,非静态的,然后你可以比较,因为如果它是静态的,数据不会随着输入而改变。
静态方法适用于一次性返回和快速计算或容易获得的数据。