热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

依赖项更改时强制类重新编译

如何解决《依赖项更改时强制类重新编译》经验,为你挑选了1个好方法。

语境:

我是java程序员,正在阅读Uncle Bob Agile软件开发.关于ISP接口隔离原则,给出了一个我理解为的参数:

让我们:

interface Service {
  function doA();
}
class ServiceImpl implements Service {...}
class ServiceClient {
  // ServiceImpl is injected; eg either through constructor or setter
  private Service service;
  function useOnlyDoA() {
    service.doA();
  }
}

现在,如果接口服务发生变化,例如doB()添加了方法,那么所有依赖类ServiceClient都必须重新编译,即使它们不使用添加的方法!(真??)

    对于java来说是真的吗?

    这对c ++来说是真的吗?

    对于哪些其他语言,它是真的,而不是?

我坚信,关于java if ServiceClient是否在包中,例如client.jar,接口Servicein service.jarServiceImplin impl.jar,然后client.jar不必重新编译和重建,如果它不使用来自Service接口的新方法,它可以与新版本的service.jarimpl.jar.在我看来,事情在java中是这样的.是其他在例如c ++或其他语言?

可能是在C++更坏,如 /sf/ask/17360801/

说清楚:

我不是要求重新编译实现更改接口的类(这很明显,它必须实现新添加的方法).但我问我是否必须重新编译使用此接口的类ServiceClient,即使类没有使用新添加的方法.可能在c ++ BC变化和客户端真的必须重新编译,但在我看来,不是在java中.

编辑:

我在java中实现了一个测试.4个罐子:

interface.jar - 包含接口 public interface Service

implementation.jar - 包含 public class ServiceImpl implements Service

两个罐子上面的变化

即使上面改变了,两个以下的罐子也没有改变

interfaceclient.jar -依赖interface.jar,包含类ClientOfService回吐Service作为构造函数的参数,它的使用该服务doA()的方法

application.jar - 依赖于以上所有jar.Main方法中的Class App创建ServiceImpl实例并将其作为arg传递给ClientOfService的构造函数,然后在ClientOfService上cals一个方法,该方法从Service调用方法doA(): public static void main(String[] args) { Service service = new ServiceImpl(); ClientOfService clientOfService = new ClientOfService(service); System.out.println("App.main() :: calling clientOfService.doWorkCallingDoAFromService"); clientOfService.doWorkCallingDoAFromService(); System.out.println("App.main() :: end of main"); }

在应用程序的主要interface.jar和implementation.jar的变化后成功运行(我加了一些未使用的方法和删除一个旧方法).

所以挑战是如何改变界面(当然不改变doA()方法声明)和实现以阻止它成功运行?可能吗?如果是这样,怎么样?



1> Christophe..:

是的,如果更改了接口,则需要重新编译用Java和C ++实现的接口的类。这有几个原因,其中包括:

Java编译器需要检查实现接口的类是否仍然兼容(实现接口的类必须实现其所有方法)。

C ++编译器可能需要更改类的技术布局(例如,vtable如果doB()是虚拟的),并验证新创建的成员函数是否没有隐藏具有相同签名但在另一个基类中的另一个成员函数。

ISP的全部目的就是避免这种情况。因此,如果doB()实际上与该接口没有任何关系,则最好选择一个带有just的隔离接口doB(),并仅更改/重新编译需要实现该接口的类。

编辑:相同的原则适用于使用该接口的类。当然,某些参数可能取决于实现:

对于C ++,为using类生成的代码将需要依赖正确的接口定义,以便可以对vtable布局做出正确的假设并生成正确的代码。这就是为什么使用类也需要重新编译的原因。

对于Java,对接口方法的调用确实可以依赖于显式名称和运行时解析。我不是Java专家,所以这里有一个更正:Java规范实际上允许对接口进行一些更改,而无需重新编译。但是有些更改需要重新编译。


推荐阅读
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
author-avatar
手机用户2602925995
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有