如代码所示,内部类也可是实现,却使用了内部接口@Singleton
public class ApplicationInfoManager {
    private static final Logger logger = LoggerFactory.getLogger(ApplicationInfoManager.class);    private static final InstanceStatusMapper NO_OP_MAPPER = new InstanceStatusMapper() {
        @Override
        public InstanceStatus map(InstanceStatus prev) {
            return prev;
        }
    };
    public static interface InstanceStatusMapper {        InstanceStatus map(InstanceStatus prev);
    }}

解决方案 »

  1.   

    可以看到接口是 public,所以外部能看到接口。
    这只是一种编程思想,面向接口编程。
      

  2.   

    我同意楼上说的面向接口编程思想,我说的详细一点,NO_OP_MAPPER全部都是大写,表示它是一个静态字段(全部大写是常用格式),InstanceStatusMapper它是一种map格式,表示映射,很明显,这个InstanceStatusMapper是想用一个函数式接口的向上转型对象来表示这个映射关系。函数式接口的优点不用我说,他可以用lambda表达式来写。
    设计者是想方便以后扩展,现在只有一个NO_OP_MAPPER,以后如果还有一个YES_OP_MAPPER怎么办呢?直接重写这个方法就可以了,而不是去添加内部类中的方法。
    private static final InstanceStatusMapper YES_OP_MAPPER = new InstanceStatusMapper() {
            @Override
            public InstanceStatus map(InstanceStatus prev) {
                return new InstanceStatus(prev.getValue()+prev.getValue());   //假设可以这样使用  
            }
        };
    或者
    private static final InstanceStatusMapper YES_OP_MAPPER = pre -> new InstanceStatus(prev.getValue()+prev.getValue());
      

  3.   

    如果你用内部类,那也得用抽象类,不能写这个方法,不然像我说的再加一个变量YES_OP_MAPPER,那你就得重新写一个类来继承你写的这个内部类,且先不说这样写比较麻烦,这个类和重写方法的子类根本不是同一个层面的东西了(父亲和儿子两个不同的层次),而YES_OP_MAPPER和NO_OP_MAPPER则是表示同一个层面的东西,虽然从语法上并没有任何的不妥,但你不觉得这样变扭吗?
    如果你说要用抽象类代替接口的话,那差不多,不过抽象类比较繁琐,本来功能就多,java中能用简单的就用简单的比较好。不然也不会产生那么多看起来一模一样只是名字不一样的接口和类了。
      

  4.   

    如果你用内部类,那也得用抽象类,不能写这个方法,不然像我说的再加一个变量YES_OP_MAPPER,那你就得重新写一个类来继承你写的这个内部类,且先不说这样写比较麻烦,这个类和重写方法的子类根本不是同一个层面的东西了(父亲和儿子两个不同的层次),而YES_OP_MAPPER和NO_OP_MAPPER则是表示同一个层面的东西,虽然从语法上并没有任何的不妥,但你不觉得这样变扭吗?
    如果你说要用抽象类代替接口的话,那差不多,不过抽象类比较繁琐,本来功能就多,java中能用简单的就用简单的比较好。不然也不会产生那么多看起来一模一样只是名字不一样的接口和类了。这样的话,还是接口的扩展性更好了,如果以后需要新的实例,只需重新实现接口内的方法就行,也就是改动的地方就是新加接口里方法的不同逻辑实现。。而如果是内部类的话,只能新建另外一个内部类来实现增加新的不同逻辑的示例。。我觉得代码改动量应该差不多。。但接口方式更符合java的思想,面向接口编程。。总之感觉最后还是:接口更符合java编程规范、思想。
      

  5.   

    今天在开JDK的时候突然明白一件事,接口和类的本质区别,就是让你在阅读的时候不必去考虑变量、私有方法和工具方法,如果是差一点的编辑器还没有一键收缩功能,接口早期的设计可能就是为了这个。看接口的时候看的都是公有方法,虽然在后期加入了default等方法,但相信设计者也会很自觉的把它们放到方便阅读的地方。