java接口版本控制_为什么要在Java中控制类和接口的可见性

java接口版本控制

维护是软件开发的重要方面之一,并且经验证明,保持较低组件可视性的软件比暴露更多组件的软件更易于维护。 您不会在一开始就意识到它,但是在重新设计应用程序时会严重错过它。 由于保持向后兼容性是许多应用程序的“必须具备”要求,因此最终会打补丁并重复同样的错误。 您不能做太多事情,因为许多其他应用程序与您的类和接口紧密集成在一起。

Java从一开始就提供对访问修饰符的支持,因此始终将封装放在优先地位。 它提供了三种方法来控制任何类型(例如,类或接口)的可见性,方法是将它们设置为公共,程序包私有或私有。 保护发生了什么事,我们不能将保护与类或接口一起使用。 不,您不能,您只能使用两个具有类型的访问修饰符,protected不是类或接口的合法修饰符。 另外,顶级类(其名称与包含它的Java源文件的名称相同)可以是公共的,也可以是包私有的(没有任何访问修饰符),也不能是私有的。

只有嵌套类可以是private,public或package-private 。 每个人都可以访问公共类,并且它是最可见的。 尝试仅公开关键接口,在您认为实现完整且成熟之前,切勿公开您的实现。 另一方面,private Type是最不可见的,并且在Java中只有嵌套的类或接口可以是private。 由于它是最不可见的,因此您可以完全控制该类,以通过经验,新技术,工具和重新设计来更改其行为。 一个聪明的中途是package-private可见性,这也是默认的可见性,没有像package-private这样的关键字。 相反,如果您不提供任何访问修饰符,则Java会假定它是程序包私有的,并随后使其仅在同一程序包上可见。 如果您的类和接口仅在同一程序包中的其他类之间共享,请使它们成为程序包专用的。 由于客户端无法访问它们,因此更改它们也是相对安全的。

除了使用访问修饰符降低类或接口的可见性之外,还有两种其他方法可以执行此操作,具体取决于您的运行时环境。 在组件级别,例如在像Websphere,Weblogic或JBoss这样的Application Server中,可以对实现类进行代理或包装,以最大程度地减少外部风险。 无论您做什么,总会有某种类型需要暴露给外部世界,但是使用代理或包装,您仍然可以管理它们。 即使客户端程序可以加载代理的实现类,它们也将大部分获得不可变的代理或包装。 例如,来自Java Servlet API(javax.servlet)的getServletContext()返回javax.servlet.ServletContext的实现,该实现通常是不可变的代理,可以履行ServletContext接口中所作的承诺。 应用服务器很可能以不同的javax.servlet.ServletContext接口实现运行。 可以在其他外部暴露的接口(例如ServletRequest,ServletResponse,javax.ejb.EJBContext,javax.ejb.TimerService等)的实现中使用类似的模式。不同的应用程序服务器可以使用不同的实现来支持这些全局接口。

Java中类和接口的可见性
编写开源库也是了解控制类和接口可见性需求的一种好方法。 另一个有趣的情况是基于组件的Java应用程序服务器,例如JBoss,WebLogic或WebSphere。 这些服务器提供低级服务,例如事务管理,安全性,持久性,对象池等。简而言之,生产系统使用应用程序服务器的代码以及应用程序的代码来完美地工作。 为了便于维护(例如在不同的应用程序服务器之间切换),您的应用程序和服务器代码应松耦合,并应保持安全距离。 为了安全起见,应从用户应用程序中完全隐藏应用程序服务器的内部实现类和接口。 如果应用程序打包了服务器包含的相同库,则必须注意服务器不要通过线程上下文类加载器无意中加载应用程序的版本。

我最喜欢的EnumSet类是控制可见性的另一个有趣示例。 Java设计人员使其成为避免实例化的抽象类,并提供了工厂方法作为创建该类实例的唯一方法,例如EnumSet.of()或EnumSet.noneOf()方法。 在内部,它们具有RegularEnumSet和JumboEnumSet形式的两个单独的实现,这些实现由静态工厂方法根据键Universe的大小自动选择。 例如,如果给定Enum中的值数小于64,则使用RegularEnumSet,否则返回JumboEnumSet的实例。 这种设计的优点在于,这两个实现都是私有包的,这意味着客户对它们一无所知。 它们对用户是完全透明的,并且通过将这些类抽象化可以增强安全性,因为您无法创建抽象类的实例 。 这不仅使您可以选择最合适的实现,而且很容易用更新更好的实现来替换它们。 尽管它们是一个非常特殊的类,RegularEnumSet使用一个长值存储枚举常量。 恕我直言,这是从JDK本身控制类的可见性的绝佳示例。

简而言之,通过最小化可见性(还利用了封装的优势),封装良好的代码将更加安全和可维护。 随着技术的发展,无论您今天写什么,都已经过了几年,所以遵循类设计的基本原则可以帮助您从更新的工具,库和JDK实现中获得最大收益。

翻译自: https://www.javacodegeeks.com/2014/09/why-you-should-control-visibility-of-class-and-interface-in-java.html

java接口版本控制

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/339757.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

遮掩java_css之图片下方定位遮掩层

需要的效果如图,图片下方加个遮掩层:html:css:.listContent>div{width:300px;height: 300px;float: left;margin-top: 20px;margin-left: 20px;position:relative;}.mask{width:300px;height: 40px;background-color:#FFCCCC;p…

使用JDK的密码流的加密怪癖(以及如何做)

在我们的日常工作中,我们经常遇到经常性的主题,即将数据(例如文件)从一个位置传输到另一个位置。 这听起来像是一个非常简单的任务,但让我们通过声明这些文件可能包含机密信息并可以通过非安全的通信渠道进行传输这一事…

python中函数的定义实例_Python基础之函数的定义与使用实例

此文实例介绍了Python基础之函数的定义与使用。推荐给大伙学习一下,内容如下:Python 定义函数使用 def 关键字,一般格式如下:def 函数名(参数列表):函数体让我们使用函数来输出"Hello World!"&am…

log4j 程序日志_使用log4j监视和筛选应用程序日志到邮件

log4j 程序日志在今天的帖子中,我将向您展示如何将日志语句过滤为警告电子邮件。 这是出于监视我正在处理的一个应用程序的一些关键点的需要。 您可以使用一些工具来执行应用程序监视。 我不会详细介绍这些工具,但有时让应用程序发送警告电子邮件会更容易…

python切换消息窗_用Python切换窗口

The way that user had defined find_window only allows you to choose by the classname of the window用户定义它的方式是将这两个参数class_name和window_name传递给^{}(后者反过来只调用Win32 API函数^{})。所以,就这样做:windowmgr.find_window(No…

Java UnknownHostException –服务器的无效主机名–如何解决?

An UnknownHostException的快速指南,如果在为远程方法调用创建到远程主机的连接时发生java.net.UnknownHostException,则会抛出该快速指南。 UnknownHostException的预防方法。 1.简介 在本教程中,我们将学习什么是UnknownHostException以及…

mongodb连接java_如何从Java EE无状态应用程序连接到MongoDB

mongodb连接java在本文中,我将介绍如何从无状态Java EE应用程序连接到MongoDB,以利用与MongoDB Java驱动程序提供的数据库的内置连接池。 如果您开发的REST API对MongoDB执行操作,则可能是这种情况。 获取Java MongoDb驱动程序 要将Java连接…

学java专科_专科学历可以学习java开发吗

学习Java的热潮越来越高涨,除了转行而来的人,很多刚毕业的学生也加入到其中。很多人都觉得学习Java需要有一个高学历作为基础,一些专科生在学习之前会犹豫,他们是否能学习Java,首先学程序开发,入行Java开发…

具有InlfuxDB的Spring Boot和Micrometer第3部分:Servlet和JDBC

在上一个博客中,我们使用由InfluxDB支持的千分尺设置了反应式应用程序。 在本教程中,我们将使用传统的带JDBC阻塞式Servlet的Spring Stack。 我选择的数据库是postgresql。 我将使用与先前博客文章相同的脚本。 因此,我们将拥有初始化数据库…

java linkedlist实例_Java Linkedlist原理及实例详解

这篇文章主要介绍了Java Linkedlist原理及实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下定义:linkedlist属于链表结构,方便添加和删除元素,但查询不方便&#xff0c…

jsf xhtml调用方法_JSF的工作方式以及调试方法–可以使用polyglot吗?

jsf xhtml调用方法JSF不是我们通常认为的那样。 这也是一个调试起来可能有些棘手的框架,尤其是在初次遇到时。 在这篇文章中,让我们继续探讨为什么会出现这种情况,并提供一些JSF调试技术。 我们将讨论以下主题: JSF不是我们经常想…

java 分别编译_Java源文件和编译后的文件扩展名分别为()_学小易找答案

【单选题】( )下列关于逻辑运算符AND,描述正确的是哪一项?【单选题】如果声明一个类时使用abstract修饰符,则表明该类是()【填空题】要查询student表中name字段值以字符“m”开始,以字符“d”结束的记录应该在WHERE子句后跟 LIKE________。【填空题】不允许在关系中出现重复记…

将Auth0 OIDC(OAUTH 2)与授权(组和角色)集成

如果您正在使用Auth0对多个现有应用程序中的用户进行身份验证和授权,则可能需要将下一个Web应用程序与Auth0集成。 有多种方法可以执行此操作,例如,如果要将Jenkins与Auth0集成,则可以使用SAML v2;否则,可…

power of two java_LeetCode算法题-Power Of Two(Java实现)

这是悦乐书的第194次更新,第200篇原创01 看题和准备今天介绍的是LeetCode算法题中Easy级别的第56题(顺位题号是231)。给定一个整数,写一个函数来确定它是否是2的幂。例如:输入:1输出:true说明:2^0 1输入&a…

tomee_一罐将其全部统治:Apache TomEE + Shrinkwrap == JavaEE引导

tomee警告:我不是Spring Boot的专家。 我发现很多事情对此非常有趣,并且当然可以真正改善您的日常工作。 而且,我对Spring Boot没有任何反对,也没有开发或使用它的人。 但是我认为社区高估了该产品。 一年前,我开始收…

java比较equlse_java基础知识要点

一、抽象:二、封装:有了封装才有数据类型!个体更多的设置为封装体,这样更加安全。该公开的公开(方法),该隐藏的隐藏(属性),配置一个访问窗口方法的调用(按值传递和按引用传递)1、在栈中分配空间(暂时给方法…

使用Spring Boot和Project Reactor处理SQS消息

我最近参与了一个项目,在该项目中,我不得不有效地处理通过AWS SQS Queue流入的大量消息。 在这篇文章(可能还有一篇)中,我将介绍使用出色的Project Reactor处理消息的方法。 以下是我要进行的设置: 设置本…

java commons lang 随机数_Apache Common-lang组件里随机数工具类RandomStringUtils的一个bug...

现在本文也转到了我自己的博客上,地址:月城小馆Apache Common组件是java开发中常用的工具,其中的common-lang包是java基本数据类型的处理工具,包括数字、字符串、日期时间等多种工具类。在org.apache.commons.lang包中有一个随机数…

初级测试开发面试题_初级开发人员在编写单元测试时常犯的错误

初级测试开发面试题自从我编写第一个单元测试以来已经有10年了。 从那时起,我不记得我已经编写了成千上万的单元测试。 老实说,我在源代码和测试代码之间没有任何区别。 对我来说是同一回事。 测试代码是源代码的一部分。 在过去的3-4年中,我…

java文件读写详细介绍_java文件读写操作大全

一.获得控制台用户输入的信息public String getInputMessage() throws IOException...{System.out.println("请输入您的命令∶");byte buffer[]new byte[1024];int countSystem.in.read(buffer);char[] chnew char[count-2];//最后两位为结束符,删去不要f…