内部类可以实现的功能为什么要用内部接口?

joethina 2018-07-30 06:51:54
如代码所示,内部类也可是实现,却使用了内部接口

@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);
}

}
...全文
469 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
xjyplayer 2018-08-18
  • 打赏
  • 举报
回复
今天在开JDK的时候突然明白一件事,接口和类的本质区别,就是让你在阅读的时候不必去考虑变量、私有方法和工具方法,如果是差一点的编辑器还没有一键收缩功能,接口早期的设计可能就是为了这个。看接口的时候看的都是公有方法,虽然在后期加入了default等方法,但相信设计者也会很自觉的把它们放到方便阅读的地方。
鸣鸣Amadues 2018-08-03
  • 打赏
  • 举报
回复
我个人看法,写成接口是便于以后扩展,当然如果一开始就知道没有扩展的需求,那写成类也没什么不好。
类和接口也只是个工具,没有一定要规定用什么,看个人偏好和实际需求
joethina 2018-08-02
  • 打赏
  • 举报
回复
呵呵呵呵呵哈哈哈
joethina 2018-08-02
  • 打赏
  • 举报
回复
额呵呵呵呵呵
joethina 2018-08-02
  • 打赏
  • 举报
回复
引用 10 楼 qq_38886825 的回复:
[quote=引用 7 楼 weixin_41932038 的回复:]
[quote=引用 6 楼 qq_38886825 的回复:]
我同意楼上说的面向接口编程思想,我说的详细一点,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());
其实我的想法是,这个内部接口真是来定义操作的规范。就像接口的定义一样,用来规范实现类操作。也应该就是所谓的一种编程思想。换成内部类的话,真心没感到任何的不妥,认知范围较小,目前这么理解[/quote]
如果你用内部类,那也得用抽象类,不能写这个方法,不然像我说的再加一个变量YES_OP_MAPPER,那你就得重新写一个类来继承你写的这个内部类,且先不说这样写比较麻烦,这个类和重写方法的子类根本不是同一个层面的东西了(父亲和儿子两个不同的层次),而YES_OP_MAPPER和NO_OP_MAPPER则是表示同一个层面的东西,虽然从语法上并没有任何的不妥,但你不觉得这样变扭吗?
如果你说要用抽象类代替接口的话,那差不多,不过抽象类比较繁琐,本来功能就多,java中能用简单的就用简单的比较好。不然也不会产生那么多看起来一模一样只是名字不一样的接口和类了。[/quote]这样的话,还是接口的扩展性更好了,如果以后需要新的实例,只需重新实现接口内的方法就行,也就是改动的地方就是新加接口里方法的不同逻辑实现。。而如果是内部类的话,只能新建另外一个内部类来实现增加新的不同逻辑的示例。。我觉得代码改动量应该差不多。。但接口方式更符合java的思想,面向接口编程。。总之感觉最后还是:接口更符合java编程规范、思想。
遇见1995 2018-08-01
  • 打赏
  • 举报
回复
接口可复用呀。
joethina 2018-08-01
  • 打赏
  • 举报
回复
呵呵呵呵呵呵呵
joethina 2018-08-01
  • 打赏
  • 举报
回复
引用 6 楼 qq_38886825 的回复:
我同意楼上说的面向接口编程思想,我说的详细一点,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());
其实我的想法是,这个内部接口真是来定义操作的规范。就像接口的定义一样,用来规范实现类操作。也应该就是所谓的一种编程思想。换成内部类的话,真心没感到任何的不妥,认知范围较小,目前这么理解
xjyplayer 2018-08-01
  • 打赏
  • 举报
回复
引用 7 楼 weixin_41932038 的回复:
[quote=引用 6 楼 qq_38886825 的回复:]
我同意楼上说的面向接口编程思想,我说的详细一点,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());
其实我的想法是,这个内部接口真是来定义操作的规范。就像接口的定义一样,用来规范实现类操作。也应该就是所谓的一种编程思想。换成内部类的话,真心没感到任何的不妥,认知范围较小,目前这么理解[/quote]
如果你用内部类,那也得用抽象类,不能写这个方法,不然像我说的再加一个变量YES_OP_MAPPER,那你就得重新写一个类来继承你写的这个内部类,且先不说这样写比较麻烦,这个类和重写方法的子类根本不是同一个层面的东西了(父亲和儿子两个不同的层次),而YES_OP_MAPPER和NO_OP_MAPPER则是表示同一个层面的东西,虽然从语法上并没有任何的不妥,但你不觉得这样变扭吗?
如果你说要用抽象类代替接口的话,那差不多,不过抽象类比较繁琐,本来功能就多,java中能用简单的就用简单的比较好。不然也不会产生那么多看起来一模一样只是名字不一样的接口和类了。
幽饮烛 2018-07-31
  • 打赏
  • 举报
回复
可以看到接口是 public,所以外部能看到接口。
这只是一种编程思想,面向接口编程。
joethina 2018-07-31
  • 打赏
  • 举报
回复
呵呵呵呵呵呵呵
joethina 2018-07-31
  • 打赏
  • 举报
回复
呵呵呵呵呵呵呵
joethina 2018-07-31
  • 打赏
  • 举报
回复
呵呵呵呵呵呵呵
xjyplayer 2018-07-31
  • 打赏
  • 举报
回复
我同意楼上说的面向接口编程思想,我说的详细一点,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());

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧