Item 14 In public classes, use accessor methods, not public fields

在public类中使用访问方法,而非公有域

这标题看起来真晦涩。。解释一下就是,如果类变成public的了--->那就使用gettersetter,不要用public成员。 要注意它的前提,如果是private的class(内部类..)或者package-private(default)的就无所谓。

退化类

退化类是只有实例域没有任何方法的类, 比如:

class Point {public double x;public double y;
}
复制代码

退化类应该是私有的或者是包级私有(package-private)的,因为退化类违反了面向对象的封装原则,暴露了实例域,所以要控制这种类的访问级别。 具体点说,如果退化类是公有的,一旦发布出去就再也不可以修改,比如把x改为a都是不可以的,因为会影响到其他使用该退化类的类(*笔者注:所以说如果代码只有你一个人用,不用发布,也就不存在封装)。

EJ上说,如果类可以在它所在的包外部进行访问,就提供访问方法。以保留将来改变该类内部呈现的灵活性(to preserve the flexibility to change the class’s internal representation.)。如果共有类暴露了数据域,将来改变 内部呈现就不可能了,因为client code已经被传播出去了。

在类需要public或者protect的访问级别时,应该把实例域变为private的,然后添加get和set方法。

另外,如果field是不可变的(final),那危害就小一些。

知乎上的一个回答: 来源:知乎 作者:仲晨链接:https://www.zhihu.com/question/21401198/answer/18113707

**的确可以暴露,如果1. 所有内外代码都是你自己写;2. 这个模块再也不改了;3. 不会继承它,或者继承但不改变语义。**David John Wheeler有一句名言:“All problems in computer science can be solved by another level of indirection.”getter、setter就是个很好的中间层。直接摘录stackoverflow上一个不错的总结:oop - Why use getters and setters?**这两个方法可以方便增加额外功能(比如验证)。 内部存储和外部表现不同。 可以保持外部接口不变的情况下,修改内部存储方式和逻辑。 任意管理变量的生命周期和内存存储方式。 提供一个debug接口。 能够和模拟对象、序列化乃至WPF库等融合。 允许继承者改变语义。 可以将getter、setter用于lambda表达式。(大概即作为一个函数,参与函数传递和运算) getter和setter可以有不同的访问级别。

转载于:https://juejin.im/post/5a31314af265da432e5c022e

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

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

相关文章

子集和与一个整数相等算法_背包问题的一个变体:如何解决Java中的分区相等子集和问题...

子集和与一个整数相等算法by Fabian Terh由Fabian Terh Previously, I wrote about solving the Knapsack Problem (KP) with dynamic programming. You can read about it here.之前,我写过有关使用动态编程解决背包问题(KP)的文章。 你可以在这里阅读 。 Today …

matplotlib图表介绍

Matplotlib 是一个python 的绘图库,主要用于生成2D图表。 常用到的是matplotlib中的pyplot,导入方式import matplotlib.pyplot as plt 一、显示图表的模式 1.plt.show() 该方式每次都需要手动show()才能显示图表,由于pycharm不支持魔法函数&a…

到2025年将保持不变的热门流行技术

重点 (Top highlight)I spent a good amount of time interviewing SMEs, data scientists, business analysts, leads & their customers, programmers, data enthusiasts and experts from various domains across the globe to identify & put together a list that…

spring—SpringMVC的请求和响应

SpringMVC的数据响应-数据响应方式 页面跳转 直接返回字符串 RequestMapping(value {"/qq"},method {RequestMethod.GET},params {"name"})public String method(){System.out.println("controller");return "success";}<bea…

Maven+eclipse快速入门

1.eclipse下载 在无外网情况下&#xff0c;无法通过eclipse自带的help-install new software输入url来获取maven插件&#xff0c;因此可以用集成了maven插件的免安装eclipse(百度一下有很多)。 2.jdk下载以及环境变量配置 JDK是向前兼容的&#xff0c;可在Eclipse上选择编译器版…

源码阅读中的收获

最近在做短视频相关的模块&#xff0c;于是在看 GPUImage 的源码。其实有一定了解的伙伴一定知道 GPUImage 是通过 addTarget 链条的形式添加每一个环节。在对于这样的设计赞叹之余&#xff0c;想到了实际开发场景下可以用到的场景&#xff0c;借此分享。 我们的项目中应该有很…

马尔科夫链蒙特卡洛_蒙特卡洛·马可夫链

马尔科夫链蒙特卡洛A Monte Carlo Markov Chain (MCMC) is a model describing a sequence of possible events where the probability of each event depends only on the state attained in the previous event. MCMC have a wide array of applications, the most common of…

PAT乙级1012

题目链接 https://pintia.cn/problem-sets/994805260223102976/problems/994805311146147840 题解 就比较简单&#xff0c;判断每个数字是哪种情况&#xff0c;然后进行相应的计算即可。 下面的代码中其实数组是不必要的&#xff0c;每取一个数字就可以直接进行相应计算。 // P…

我如何在昌迪加尔大学中心组织Google Hash Code 2019

by Neeraj Negi由Neeraj Negi 我如何在昌迪加尔大学中心组织Google Hash Code 2019 (How I organized Google Hash Code 2019 at Chandigarh University Hub) This is me !!! Neeraj Negi — Google HashCode Organizer这就是我 &#xff01;&#xff01;&#xff01; Neeraj …

leetcode 665. 非递减数列(贪心算法)

给你一个长度为 n 的整数数组&#xff0c;请你判断在 最多 改变 1 个元素的情况下&#xff0c;该数组能否变成一个非递减数列。 我们是这样定义一个非递减数列的&#xff1a; 对于数组中所有的 i (0 < i < n-2)&#xff0c;总满足 nums[i] < nums[i 1]。 示例 1: …

django基于存储在前端的token用户认证

一.前提 首先是这个代码基于前后端分离的API,我们用了django的framework模块,帮助我们快速的编写restful规则的接口 前端token原理: 把(token加密后的字符串,keyname)在登入后发到客户端,以后客户端再发请求,会携带过来服务端截取(token加密后的字符串,keyname),我们再利用解密…

数据分布策略_有效数据项目的三种策略

数据分布策略Many data science projects do not go into production, why is that? There is no doubt in my mind that data science is an efficient tool with impressive performances. However, a successful data project is also about effectiveness: doing the righ…

cell 各自的高度不同的时候

1, cell 根据文字、图片等内容&#xff0c;确定自己的高度。每一个cell有自己的高度。 2&#xff0c;tableView 初始化 现实的时候&#xff0c;不是从第一个cell开始显示&#xff0c;&#xff08;从第二个&#xff1f;&#xff09;&#xff0c;非非正常显示。 a:cell 的高度问题…

leetcode 978. 最长湍流子数组(滑动窗口)

当 A 的子数组 A[i], A[i1], …, A[j] 满足下列条件时&#xff0c;我们称其为湍流子数组&#xff1a; 若 i < k < j&#xff0c;当 k 为奇数时&#xff0c; A[k] > A[k1]&#xff0c;且当 k 为偶数时&#xff0c;A[k] < A[k1]&#xff1b; 或 若 i < k < j&…

spring boot源码下载地址

github下载&#xff1a; https://github.com/spring-projects/spring-boot/tree/1.5.x git地址&#xff1a; https://github.com/spring-projects/spring-boot.git 因为项目中目前使用的就是spring boot 1.5.19版本&#xff0c;因此这里先研究spring boot 1.5版本源码.转载于:h…

java基础学习——5、HashMap实现原理

一、HashMap的数据结构 数组的特点是&#xff1a;寻址容易&#xff0c;插入和删除困难&#xff1b;而链表的特点是&#xff1a;寻址困难&#xff0c;插入和删除容易。那么我们能不能综合两者的特性&#xff0c;做出一种寻址容易&#xff0c;插入删除也容易的数据结构&#xff1…

看懂nfl定理需要什么知识_NFL球队为什么不经常通过?

看懂nfl定理需要什么知识Debunking common NFL myths in an analytical study on the true value of passing the ball在关于传球真实价值的分析研究中揭穿NFL常见神话 Background背景 Analytics are not used enough in the NFL. In a league with an abundance of money, i…

Docker初学者指南-如何创建您的第一个Docker应用程序

您是一名开发人员&#xff0c;并且想要开始使用Docker&#xff1f; 本文是为您准备的。 (You are a developer and you want to start with Docker? This article is made for you.) After a short introduction on what Docker is and why to use it, you will be able to cr…

mybatis if-else(写法)

mybaits 中没有else要用chose when otherwise 代替 范例一 <!--批量插入用户--> <insert id"insertBusinessUserList" parameterType"java.util.List">insert into business_user (id , user_type , user_login )values<foreach collection…

spring—拦截器和异常

SpringMVC的拦截器 SpringMVC拦截器-拦截器的作用 Spring MVC 的拦截器类似于 Servlet 开发中的过滤器 Filter&#xff0c;用于对处理器进行预处理和后处理。 将拦截器按一定的顺序联结成一条链&#xff0c;这条链称为拦截器链&#xff08;InterceptorChain&#xff09;。在…