如果需要更改库功能该怎么办

时间:2019-01-23 17:29:55

标签: java oop open-source

我在Java库(open-m3u)中有一个类,只需稍作更改即可。 我无需使用该库即可轻松实现该功能。该库是开源的,因此我可以访问其所有代码。该类的创建方式无法继承它,甚至无法更改其中的一小部分。我的问题是,我应该复制该类及其依赖的所有类,并将它们放入我自己的代码库中并更改功能,还是应该自己实现此功能。还是还有其他选择?

3 个答案:

答案 0 :(得分:1)

Decorator pattern允许您向现有对象添加新功能。

如果您使用的Java库具有这样的任何类:

public class LibraryClass implement ILibraryInterface {

    public void someMethod() {
        ...
    }
}

然后您可以创建Decorator类:

public class LibraryClassDecorator implement ILibraryInterface {

    private LibraryClass libObj;

    public LibraryClassDecorator(LibraryClass libObj) {
        this.libObj = libObj;
    }

    public void someMethod() {
        libObj.someMethod();
        // here you can do whatever you want. 
        // Add some additional logic
        // transform result value if there is some
    }

}

注意:您必须实现相同的界面才能遵循Liskov substitution principle

答案 1 :(得分:1)

  

该功能很容易自行实现,而无需使用   库。

恕我直言,那就是要走的路。您的其他选择是:

  • 围绕库构建功能:您说这是不可能的。
  • 在您自己的源代码控制系统中创建库的分支。这意味着您必须使该存储库与库维护者保持同步,这意味着永久负担。而且,您必须检查图书馆的许可证中关于分叉的内容。
  • 将相关部分复制到您的代码库中,然后在其中进行修改。这样一来,您就不会从将来的增强功能或错误修复中受益,但仍然必须维护由其他人创建和设计的代码,而这些代码并不完全符合您的要求。而且,您必须检查图书馆许可书中关于将零件复制到外部代码库中的内容。

它们都有缺点。

总的来说:在25年的专业软件开发中,我已经看到成功使用外部库以及完全失败。有时候,我们花费了更多的时间来评估现有的库(然后发现没有匹配的库),这比我们自己实施特定于项目的解决方案所需的时间还要多。

每一个您可以不用的库,使配置管理和部署更加容易。

答案 2 :(得分:-1)

一种解决方案是制作一个类,以扩展您要更改的类并覆盖要更改的部分