Item 14 In public classes, use accessor methods, not public fields
在public类中使用访问方法,而非公有域
这标题看起来真晦涩。。解释一下就是,如果类变成public的了--->那就使用getter
和setter
,不要用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
Item 14 In public classes, use accessor methods, not public fields相关推荐
- Effective Java 英文 第二版 读书笔记 Item 14:In public classes,use accessor methods,not public fields...
本章主要分析 公开属性与私有属性提供公开get.set方法两种方式对比 // Degenerate classes like this should not be public! class Poin ...
- 【Groovy】编译时元编程 ( AST 语法树分析 | ClassNode 根节点 | 方法 Methods 节点 | 字段 Fields 节点 | 属性 Properties 节点 )
文章目录 一.AST 语法树分析 一.AST 语法树分析 在上一篇博客 [Groovy]编译时元编程 ( 编译时元编程引入 | 声明需要编译时处理的类 | 分析 Groovy 类的 AST 语法树 ) ...
- Item 14: 如果函数不会抛出异常就把它们声明为noexcept
本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 在C++98中,异常规范(exception specificat ...
- 《Effective C#》Item 14:使用构造函数初始化语句
在写程序的时候,往往会出现为一个类型提供不同场景的构造函数,可能大多构造函数比较相似,而C#中又不允许缺省参数,因此构造函数的编写无疑是一个重复工作.但是使用Copy和Paste来完成构造函数的编写, ...
- Effective C++学习笔记(Part One:Item 1-4)
2019独角兽企业重金招聘Python工程师标准>>> 最近终于把effectvie C++仔细的阅读了一边,很惊叹C++的威力与魅力.最近会把最近的读书心得与读书笔记记于此,必备查 ...
- c语言中public 用法,深入理解C++中public、protected及private用法
初学C++的朋友经常在类中看到public,protected,private以及它们在继承中表示的一些访问范围,很容易搞糊涂.今天本文就来十分分析一下C++中public.protected及pri ...
- java的public int_Java语言中“int”、“public”、“static int ”有什么区别?
展开全部 首先62616964757a686964616fe58685e5aeb931333365646331说一下int 和public int的区别: 这个问题是作用域的问题,就是说这个变量的作用 ...
- EffectiveJava(v3) - chapter3: Classes and Interfaces
Classes and Interfaces 类和接口是Java编程中的核心, 提供了基础的抽象模块. 本章专注于如何使用类和接口来实现强壮的, 灵活的, 高可用的代码. Introduce Effe ...
- jooq生成records_Java 14 Records类
jooq生成records Java 14 introduced a new way to create classes called Records. In this tutorial, we wi ...
最新文章
- Django 验证码4.4
- 五个角度解释深度学习中 Batch Normalization为什么效果好?
- 睡不着的时候,我会......
- c# 多态实现_虚方法
- 我要彻底给你讲清楚,Java就是值传递,不接受争辩的那种!
- python语言基础项目报告书_25个Python学习项目,值得推荐
- USACO Section1.2 Your Ride Is Here(水题)
- CNCF Serverless工作流社区携手华为云FunctionGraph,开拓Serverless编排新时代
- 学习iot_腾讯 AI Lab智慧农业组招收多名算法工程实习生 -- IOT/机器学习方向
- 【最强干货】如何在拥抱云原生浪潮中脱颖而出呢?
- Jenkins+Github(Robotframework代码)
- linux换硬盘网卡不能启动,服务器硬盘冷迁移后网卡无法启动问题
- 【Win 10 应用开发】在App所在的进程中执行后台任务
- PS批量处理图片之批量转换dds格式
- Discuz代码分析:getgpc($k, $t='GP')获取超全局数组值
- 【005】基于Vue.js及相关插件的仿微博移动版的单页应用(SPA)项目(含源码、运行教程)
- Docker桥存储卷管理
- 什么叫做项目孵化_什么是创业孵化园,孵化基地的五大要素有哪些?
- 成为新时代大数据工程师要满足哪些要求?
- discuz mysql cpu 100_Discuz导致MYSQL CPU 占用 100%?
热门文章
- Java PushbackReader ready()方法与示例
- Java ClassLoader findLoadedClass()方法与示例
- 焊接空间臂_焊接烟尘净化器设备哪种好
- controller控制器怎么写_I2C控制器编程_框架
- python用电度数设计_无所不能的Python之配电设计自动化系统
- C++中几种将整数转换成二进制输出的方法
- LeetCode 128. 最长连续序列 golang
- 198. 打家劫舍 golang 动态规划 数组越界
- linux线程学习初步02
- HDU1999不可摸数-暴力打表