在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

Item 14 In public classes, use accessor methods, not public fields相关推荐

  1. 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 ...

  2. 【Groovy】编译时元编程 ( AST 语法树分析 | ClassNode 根节点 | 方法 Methods 节点 | 字段 Fields 节点 | 属性 Properties 节点 )

    文章目录 一.AST 语法树分析 一.AST 语法树分析 在上一篇博客 [Groovy]编译时元编程 ( 编译时元编程引入 | 声明需要编译时处理的类 | 分析 Groovy 类的 AST 语法树 ) ...

  3. Item 14: 如果函数不会抛出异常就把它们声明为noexcept

    本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 在C++98中,异常规范(exception specificat ...

  4. 《Effective C#》Item 14:使用构造函数初始化语句

    在写程序的时候,往往会出现为一个类型提供不同场景的构造函数,可能大多构造函数比较相似,而C#中又不允许缺省参数,因此构造函数的编写无疑是一个重复工作.但是使用Copy和Paste来完成构造函数的编写, ...

  5. Effective C++学习笔记(Part One:Item 1-4)

    2019独角兽企业重金招聘Python工程师标准>>> 最近终于把effectvie C++仔细的阅读了一边,很惊叹C++的威力与魅力.最近会把最近的读书心得与读书笔记记于此,必备查 ...

  6. c语言中public 用法,深入理解C++中public、protected及private用法

    初学C++的朋友经常在类中看到public,protected,private以及它们在继承中表示的一些访问范围,很容易搞糊涂.今天本文就来十分分析一下C++中public.protected及pri ...

  7. java的public int_Java语言中“int”、“public”、“static int ”有什么区别?

    展开全部 首先62616964757a686964616fe58685e5aeb931333365646331说一下int 和public int的区别: 这个问题是作用域的问题,就是说这个变量的作用 ...

  8. EffectiveJava(v3) - chapter3: Classes and Interfaces

    Classes and Interfaces 类和接口是Java编程中的核心, 提供了基础的抽象模块. 本章专注于如何使用类和接口来实现强壮的, 灵活的, 高可用的代码. Introduce Effe ...

  9. jooq生成records_Java 14 Records类

    jooq生成records Java 14 introduced a new way to create classes called Records. In this tutorial, we wi ...

最新文章

  1. Django 验证码4.4
  2. 五个角度解释深度学习中 Batch Normalization为什么效果好?
  3. 睡不着的时候,我会......
  4. c# 多态实现_虚方法
  5. 我要彻底给你讲清楚,Java就是值传递,不接受争辩的那种!
  6. python语言基础项目报告书_25个Python学习项目,值得推荐
  7. USACO Section1.2 Your Ride Is Here(水题)
  8. CNCF Serverless工作流社区携手华为云FunctionGraph,开拓Serverless编排新时代
  9. 学习iot_腾讯 AI Lab智慧农业组招收多名算法工程实习生 -- IOT/机器学习方向
  10. 【最强干货】如何在拥抱云原生浪潮中脱颖而出呢?
  11. Jenkins+Github(Robotframework代码)
  12. linux换硬盘网卡不能启动,服务器硬盘冷迁移后网卡无法启动问题
  13. 【Win 10 应用开发】在App所在的进程中执行后台任务
  14. PS批量处理图片之批量转换dds格式
  15. Discuz代码分析:getgpc($k, $t='GP')获取超全局数组值
  16. 【005】基于Vue.js及相关插件的仿微博移动版的单页应用(SPA)项目(含源码、运行教程)
  17. Docker桥存储卷管理
  18. 什么叫做项目孵化_什么是创业孵化园,孵化基地的五大要素有哪些?
  19. 成为新时代大数据工程师要满足哪些要求?
  20. discuz mysql cpu 100_Discuz导致MYSQL CPU 占用 100%?

热门文章

  1. Java PushbackReader ready()方法与示例
  2. Java ClassLoader findLoadedClass()方法与示例
  3. 焊接空间臂_焊接烟尘净化器设备哪种好
  4. controller控制器怎么写_I2C控制器编程_框架
  5. python用电度数设计_无所不能的Python之配电设计自动化系统
  6. C++中几种将整数转换成二进制输出的方法
  7. LeetCode 128. 最长连续序列 golang
  8. 198. 打家劫舍 golang 动态规划 数组越界
  9. linux线程学习初步02
  10. HDU1999不可摸数-暴力打表