Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我们要在类中声明接口?_Java - Fatal编程技术网

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

Java 为什么我们要在类中声明接口?,java,Java,为什么我们要在Java类中声明接口 例如: public class GenericModelLinker implements IModelLinker { private static final Logger LOG =LoggerFactory.getLogger(GenericModelLinker.class); private String joinAsPropertyField; private boolean joinAsListEntry; private

为什么我们要在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);

  }
}
公共类GenericModelinker实现IModelLinker{
私有静态最终记录器LOG=LoggerFactory.getLogger(GenericModelLinker.class);
私有字符串joinAsPropertyField;
私有布尔joinAsListEntry;
私有布尔清除列表;
私有列表连接;
//而不是标量属性
私有财产;
公共接口链路{
对象getProperty(IAdaptable n);
void setProperty(IAdaptable n,对象值);
}
}

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


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

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

如果要在对象中收集一些字段以强调概念,可以创建外部类或内部类(称为嵌套类(静态类)或内部类)

如果您想强调这样一个事实,即这个协作类在原始对象使用之外完全没有意义(没有用处),那么可以将其嵌套/内部

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

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


当然,
Map.Entry
需要声明为
public
,以便在代码所在的任何位置迭代Map时都可以访问。

在类中,您可能需要一个接口的多个实现,该接口只与该特定类相关。在这种情况下,将其作为内部接口,而不是公共/包专用接口。

只有类内的接口才能声明为私有或受保护。有时,当接口只适合在外部类(或其子类)内部使用时,这是有意义的

以通用且可恢复的方式封装行为

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

class Test
{

..
interface Cipher {
 doAction();
}
class RAMPCipher implements Cipher{}
class DiskCipher implements Cipher{}
..
}

但是接口是公共的,所以这个目标在这里实现了吗?公共的但是在主类下,所以不是真正的公共的。这些实现无法工作,因为它们需要超级接口而不是类下的接口(我刚刚在一个Spring应用程序中遇到了这个问题)@ChaibiAlaa,您可能对Spring有问题,因为您的内部类/initerface没有声明为public。您特定的问题超出了这个问题的范围,因此,如果您想找到问题的解决方案,欢迎您提出具体问题。具有讽刺意味的是,
Map.Entry
实现实际上是由
Map
上下文之外的人使用的,用于Java缺少的
类的功能。讨论。然而,这里有一个很好的答案。