46

为什么我们要在 Java 的类中声明接口?

例如:

public class GenericModelLinker implements IModelLinker {

  private static final Logger LOG =LoggerFactory.getLogger(GenericModelLinker.class);
  private String joinAsPropertyField;
  private boolean joinAsListEntry;
  private boolean clearList;
  private List<Link> joins;

  //instead of a scalar property
  private String uniqueProperty;

  public interface Link {

    Object getProperty(IAdaptable n);

    void setProperty(IAdaptable n, Object value);

  }
}
4

5 回答 5

39

当您想在对象中收集一些字段以强调一个概念时,您可以创建一个外部类或内部类(称为嵌套(静态)或内部)。

如果你想强调这个合作类在原始对象使用之外完全没有意义(没有用处),你可以让它嵌套/内部。

因此,在处理某些层次结构时,您可以描述一个“嵌套” interface,它将由包装类的子类实现。

在JDK中,最重要的例子是Map.Entry内部接口,在Map接口内定义并通过各种方式实现HashMapLinkedHashMap等等......

当然,Map.Entry需要声明为public以便在迭代地图时无论代码在哪里都可以访问。

于 2013-05-20T11:42:29.933 回答
13

如果接口定义很小,并且接口只能由定义它的类的客户端使用,那么这是组织代码的好方法。否则,接口应该在它自己的文件中定义。

于 2013-05-20T11:40:08.267 回答
5

这是内部接口。Java 编程语言允许定义内部类和接口。如果您想通过当前外部类的范围来限制此类或接口的可见性,这通常很有用。

有些人使用这种机制来创建一种命名空间。恕我直言,这是对语言功能的滥用(在大多数情况下)。

于 2013-05-20T11:39:15.407 回答
2

以通用和可重复的方式封装行为。

除了实现类Map.Entry使用的很好的例子之外,Map另一个很好的例子是实现Strategy Pattern,其中执行策略在内部进行评估和应用。

class Test
{

..
interface Cipher {
 doAction();
}
class RAMPCipher implements Cipher{}
class DiskCipher implements Cipher{}
..
}
于 2013-05-20T11:56:56.703 回答
1

在您的类中,您可能需要一个接口的多个实现,这仅与该特定类相关。在这种情况下,使其成为内部接口,而不是公共/包私有接口。
只有类中的接口才能声明为私有或受保护的。有时,当接口只适合在外部类(或其子类)中使用时,这是有道理的。

于 2013-05-20T11:47:10.053 回答