当前位置: 首页 > 知识库问答 >
问题:

在生产应用程序中使用接口的优势

公西苗宣
2023-03-14

我用java编程了一段时间,没有太多使用的接口。我只是想知道使用接口有什么好处。我读了一篇关于松散耦合的文章,它指出

紧密耦合使得添加新功能变得更加困难。通过松耦合,您可以轻松更换组件。这也使您的系统随着系统的增长而更加可扩展。使用松散耦合,您可以在向系统添加新功能时安全地编写附加代码,而不会破坏现有功能。

读完这篇文章后,我明白了关键是类/组件可以很容易地交换,这有助于在不破坏现有功能的情况下实现代码的可扩展性。代码交换是有意义的,但不破坏更改的代码可扩展性对我来说没有意义。

我最初尝试创建一个名为Player的界面。

public interface Player {
  void play();
}

创建此接口后,我已经实现了此接口的合约

public class BlackPlayer implements Player{
    @Override
    public void play() {
        System.out.println("playing videos from black player");
    }
}

最后,我创建了一个 VideoPlayer 类,构造函数采用 Player 实现的类。

public class VideoPlayer {
    private Player videoplayer;
    VideoPlayer(Player videoplayer){
        this.videoplayer = videoplayer;
    }
    void playVideo(){
        videoplayer.play();
    }
}

在main方法中,我正在创建Video oPlayer实例并使用其功能

class Main{
    public static void main(String[] args) {
        VideoPlayer player = new VideoPlayer(new BlackPlayer());
        player.playVideo();
    }
}

Java接口有助于在不破坏更改的情况下实现代码可扩展性、轻松的实现交换和轻松的单元测试(暂时不包括测试)。

未来,我计划添加不同的播放器,我可以很容易地将其实现替换为其他类,这些类实现了player的契约,我们称之为Redplayer。现在我可以很容易地通过这行代码来交换实现Before-<code>VideoPlayer player=new VideoPlayer(new BlackPlayer())之后-VideoPlayer播放器=新的Video播放器(新的RedPlayer())

纠正我,如果我告诉任何错误的实现交换。

现在第二件事让我很困惑。

接口有助于在不破坏其功能的情况下实现可扩展代码。

未来,我的所有应用程序用户都会请求暂停功能,该功能已经在生产中。现在,我正在尝试将附加合同添加到已经创建的界面中。

public interface Player {
    void play();
    void pause();
}

添加这个暂停合约后,所有实现Player的类都显示错误,覆盖了暂停的缺失。通过引入暂停合约破坏了我现有的类。

那么,如何在不破坏现有功能的情况下实现代码扩展性。如何使用新功能扩展应用程序?


共有1个答案

欧阳昊焱
2023-03-14

向接口添加新方法将破坏该接口所有现有实现的编译。这就是为什么多年来Java没有向其核心库类(如集合)添加任何功能。在Java8中,他们增加了添加接口方法默认实现的能力,这样他们就可以向集合接口添加新方法,而不会破坏每个升级的编译。

因此,为了回答你的问题,你总是可以向接口添加一个新方法,并给它一个默认的实现,这样你就不会破坏任何现有的代码。第二种方法是创建一个名为PausablePlayer的新接口,它具有暂停方法。Java你可以实现多个接口,因此任何支持暂停的实现都可以实现现有接口之外的新接口。当您想添加仅适用于某些实现但不适用于所有实现的功能时,这种方法效果最好。

 类似资料:
  • 在这个博客里,他们说。net标准2.0它有一个一致性状态。 在官方网站上,没有说如果。net standard 2.0是预览版或最终版。 但我想,.net标准2.0是最终版本,因为EF Core 2.0最终版已经过时,这使用了.net标准2.0.也许EF Cor可以是最终版,而.net标准1.0仍然是预览版,但我想这会很奇怪。 另外,我知道要使用.net标准,我必须使用VS2017 15.3,这是

  • 当我在spring boot应用程序中使用lombok时,java:java。生成lang.ExceptionInInitializerError。我能做些什么来防止这个错误? 我都做了些什么? > 我已经在IntelliJ中安装了lombok插件,并在安装插件后重新启动了它。 我已经启用了两个版本的注释处理器 > 文件- 我还尝试将pom.xml中的依赖范围更改为“提供” 我尝试了龙目的其他版本

  • 问题内容: 对于那些在生产环境中运行Go后端的人: 运行Go Web应用程序的堆栈/配置是什么? 除了人们使用标准库net / http包来保持服务器运行之外,在该主题上我还没有看到太多内容。我阅读了使用Nginx将请求传递到Go服务器的信息- 使用Go的 Nginx 在我看来,这有点脆弱。例如,如果重新启动计算机(没有其他配置脚本),服务器将不会自动重新启动。 是否有更可靠的生产设置? 除了我的

  • 我正在使用分离的存储库(后端)进行MERN堆栈项目 但是,当我切换到生产环境并将代理值替换为部署的链接时,“代理”不再受支持。我做了一个关于它的搜索,我发现它只是为了开发环境,我尝试了在互联网上找到的几个解决方案,但没有运气! 顺便说一下,我用Heroku部署后端,用Netlify部署前端。现在,它们都部署好了,没有任何错误,但是后端和前端之间没有连接。

  • 我已经看到了新版本的Android反应本机,并尝试了一些示例。它仅适用于USB调试模式和“adb反向tcp: 8081 tcp: 8081”。我如何为“生产”构建Android应用程序,包括所有依赖项,而无需反应Web服务器连接。谢谢你。

  • 我正在部署一个网站,它将有几个反应项目,是用create-react-app构建的。每个项目都将在自己的网页上:例如:mywebsite.com/project1,mywebsite.com/project.我正在Ubuntu服务器上设置一个nginx反向代理(我知道如何配置),但我不确定如何指定端口号对于我的每个创建-反应-应用程序项目,以便每个项目都有一个唯一的端口。有人能解释一下如何做到这一