为了账号安全,请及时绑定邮箱和手机立即绑定

Java如何在保持兼容性的同时扩展第3方应用程序

Java如何在保持兼容性的同时扩展第3方应用程序

不负相思意 2021-09-12 16:24:36
我正在开发基于开源项目的应用程序。我们付钱给开发人员,让他们根据他们的代码制作我们自己的封闭源代码应用程序。我们确实希望与原始软件包保持兼容,安全性和功能更新将与我们的应用程序合并。当然,如果我大量修改原始代码,这里最大的问题是与新更新的合并。我在网上搜索了最佳的解决方案和他人之间,我发现喜欢的网站这一个。所以我决定尽可能不修改原始代码。如果我想向现有特性添加功能,我会扩展原始类,使应用程序指向我的扩展类(这是一个足够小的修改,不会成为问题),然后实现我的更改。这里的问题是第 3 方类中的属性属于我也想扩展的类型。在下面的示例class A中,对myClass我希望它继续执行的属性进行了一些修改。但是class B,其 extends class A,包含一个具有扩展MyClass自身类型的属性,这里是MyCustomClass。在内部,class B我希望该属性myCustomClass是 的扩展myClass,对所做的任何更改都myClass应该可以在myCustomClass.据我所知,不可能强制myClass转换myCustomClass为,因为myClass根本不是 type myCustomClass。那么这里最好的解决方案是保持兼容性class A并且不涉及仅仅复制所有代码,class A因为如果class A获得更新会产生完全相同的问题?这里有一些示例代码可以更好地解释我的问题:// Classes 'A' and 'MyClass' are 3rd party, I do not want to edit thempublic class A {    private MyClass myClass;    A(){        myClass = new MyClass();        // Changes I want to keep doing        doSomething();    }    public void doSomething(){        // Do some calculations to myClass and modify it accordingly     }    public MyClass getMyClass(){        return myClass    }}// Classes 'B' and 'MyCustomClass' are 1st party, I can do anything I want with them :)public class B extends A{    private MyCustomClass myCustomClass;            B(){        super();        myCustomClass = ?????????;        // Extremely important message, this should keep working        System.out.println(myCustomClass.verySpecialString);        // Build further on made modifications, this should keep working too        useModificationsByClassA();    }    public void useModificationsByClassA(){        // Use result of class A's calculations in order to continue    }}public class MyCustomClass extends MyClass{    private String verySpecialString;    MyCustomClass(){        super();        verySpecialString = "Hey!";    }}
查看完整描述

2 回答

?
RISEBY

TA贡献1856条经验 获得超5个赞

考虑使用适配器或装饰器模式,并使用组合而不是继承。例如:


public class B {

    private final A a;        

    private final MyCustomClass myCustomClass;


    B(A a) {

        this.a = a;

        myCustomerClass = new MyCustomClass(a.getMyClass());

    }


   public void doSomething()  {

     a.doSomething();   // updates the state of a.myClass.

     myCustomerClass.doSomething();  // use the change of a.myClass to do more stuff         

   }

}


public class MyCustomClass {

   private final MyClass myClass;

   private String verySpecialString;


   public MyCustomClass(MyClass myClass) {

      this.myClass = myClass;

   }


   public void doSomething() {

      verySpecialString = "Hey!" + myClass.getSomeResult();

   }

}


查看完整回答
反对 回复 2021-09-12
?
一只名叫tom的猫

TA贡献1906条经验 获得超3个赞

一般而言,在应用程序、库等 for... 中,某些组件被设计为可扩展(因为虽然是 for),而某些其他组件实际上并未被设计为可扩展。
但是修改一个现有的组件通常不是扩展应用程序行为的方式。
因为现有的组件通常不是为了修改而设计的。他们的实际逻辑/处理可能会从一个版本到另一个版本发生很大变化。这些可能会从源代码或其他任何东西中删除......因此您将很难将原始源的更新合并到应用程序修改后的实现的源代码中。

长话短说:应用程序可能允许扩展,但在这种情况下,它也提供了扩展点,您不能以任何方式更改任何类。
如果您想扩展原始源代码的某些部分,您必须知道实际应用程序是否旨在扩展,如果是,如何扩展
如果它不是为扩展而设计的,您应该接受应用程序更新可能不会集成(或难以集成)到修改后的应用程序中。


查看完整回答
反对 回复 2021-09-12
  • 2 回答
  • 0 关注
  • 133 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信