改善java程序的151个建议 读后感三

Github即将破百万的PDF:编写高质量代码改善JAVA程序的151个建议 在通往"Java技术殿堂"的路上,本书将为你指点迷津!内容全部由Java编码的最佳 实践组成,从语法、程序设计和架构、工具和框架、编码风格和编程思想等五大方面,对 Java程序员遇到的各种棘手的疑难问题给出了经验性的解决方案,为Java程序员如何编写 高质量的Java代码提出了151条极为宝贵的建议。对于每一个问题,不仅以建议的方式从 正反两面蛤出了被实践证明为十分优秀的解决方案和非常精糕的解决方案,而且还分析了 问题产生的根源,犹如醍醐灌顶,让人豁然开朗。 全书-共12章,... 阅读详情
改善java程序的151个建议 读后感三


建议12:避免用序列化类在构造函数中为不变量(final关键字修饰的变量)赋值


代码1:
public class Persion implements Serializable{


private static final long serialVersionUID = 1L;


public final String name;


public Persion () {
name = "liangpeng";
}

}


将 代码1 通过 ObjectOutputStream 的 writeObject(Object obj) 方法写入到一个文件中。然后将 Persion 的 name 的只修改为 liangpengGood


这时 通过 ObjectInputStream 的 readObject() 方法读取一个对象,这时打印Psersion的name值,您觉得是不是应该输出 liangpengGood,但是输出


结果是 liangpeng


至于为什么下面会进行解释


反序列化时构造函数不会执行


反序列化的执行过程:JVM从数据流中获取一个object对象,然后根据数据流中的类文件描述信息(在序列化时,磁盘的对象文件中包含了类的描述信息,注意是类的描述信息,不


是类)查看,发现是final变量,需要重新计算。于是引用Persion类中的name值,而此时JVM又发现name竟然没有赋值,不用引用,于是它很聪明的不再初始化,保持原值状态,所


以结果就是 liangpeng 了。


下面在说一下即使类实现了 serializable 接口后仍然不能序列化的情况
a:static修饰的字段
b:transient关键字修饰的字段
c:父类没有实现serializable接口,序列化时只会序列化子类不会序列化父类。
(欢迎大家积极补充,一起学习成长)


建议,在定义final变量时,就尽量给定它的初始值。


建议13:避免为final变量复杂赋值


建议12所有的final会被重新赋值,其中的“值”指的是简单的对象。简单的对象包括:8个基本数据类型,以及数组,字符串(字符串情况很复杂,不通过new关键字生成String对


象的情况下,final变量的赋值与基本类型相同),但是不能方法赋值。
其中的原理是这样的,保存到磁盘上(或者网络传输)的对象文件包括两部分:
a:类的描述信息
但是不会保存方法,构造函数,static变量等的具体实现。其他的信息,例如,包路径、继承关系、访问权限,等都会保存。
b:没有使用transient关键字修饰和static关键字修饰的实例变量值(如果是实例变量值,是复杂对象,那么连该对象和关联类信息一起保存,并且递归下去,关联类也必须实现

Serializable接口,否则会出现序列化异常)


总结一下,反序列化时final变量在以下情况下不会被重新赋值:

通过构造函数为final变量赋值

通过方法返回值为final变量赋值

final修饰的属性不是基本类型


建议14:使用序列化类的私有方法巧妙解决部分属性持久化的问题


实现Serializable接口的类,可以在类里定义一个readObject方法
private void readObject(java.io.ObjectInputStream stream)
throws IOException, ClassNotFoundException{
stream.defaultReadObject();
stream.readInt();


}
和一个writeObject方法
private void writeObject(java.io.ObjectOutputStream stream)
throws IOException {


stream.defaultWriteObject();
stream.writeInt(12);


}


方法签名必须一个字母都不能差。这样,当你调用ObjectOutputStream类把一个对象转换成数据流时,会通过反射检查
被序列化的类是否有writeObject方法,若没有,则有ObjectOutputStream按照默认的规则继续序列化。同样,在从流
数据恢复成实例对象时,也会检查是否有一个私有的readObject方法,如果有,则会通过该方法读取属性值。


注意:stream.writeXX 和 stream.writeXX,分别写入和读取相应的值,类似一个队列,先进先出,如果此处有复杂的数据逻辑,
建议封装Collection对象处理。


建议15:break 万万不可忘


public class SuggestTwo {


public static void main(String[] args) {
String str = "";
int n = 0;
switch(n) {
case 0 : str = "a"; 
case 1 : str = "b";
default : str = "liangpeng";
}
System.out.println("a="+str);
}


}


这段代码的执行结果是,a=liangpeng。


原因是,每个case语句后面少加了break关键字。程序从 case 0 后面的语句开始执行,知道找到最近的break语句结束,但可惜的是我们程序中
没有break语句,于是程序执行的过程中,str被多次赋值,switch语句执行结束了,于是结果也就如此了。


编写高质量代码--改善Java程序的151个建议精要 声明:本文只是把秦小波所著《编写高质量代码--改善Java程序的151个建议》艺术 阅读详情

相关推荐

MTK Tunning ISP 模块面试总结

ISP面试问答

m0_72053187的博客 4540

读书笔记----《编写高质量代码:改善Java程序的151个建议》第八/九章

读书笔记----《编写高质量代码:改善Java程序的151个建议》第六/七章

syney120的专栏 607

如何实现电路级别的CDM ESD防护

采用先进制程的CMOS工艺,可能具有比以前更薄的栅极氧化物和更大的芯片尺寸,大的衬底可能积累大量的电荷,导致CDM事件期间的高ESD放电峰值电流。传统CDM保护器件使用栅极接地NMOS被添加到输入级的栅极。然而,这种方法通常会在信号路径上引入显著的寄生电容,这不适合RF应用。

weixin_42693135的博客 2504

改善java程序的151个建议

《编写高质量代码-改善java程序的151个建议》 --秦小波 第一章、开发中通用的方法和准则 1、不要在常量和变量中出现易混淆的字母 long a=0l; --> long a=0L; 2、莫让常量蜕变成变量 static final int t=new Random().nextInt(); 3、三元操作符的类型无比一致 int i=80;...

weixin_30654583的博客 1987

OpenCV学习笔记(25)基于MFC和OpenCV的摄像机定标与立体匹配测试程序(20140505更新)

最近整理了一下这两年一直在用的摄像机定标与立体匹配测试程序,将代码进行了重构,界面也做了调整,分享出来方便有需要的朋友使用。当然我的编程能力有限,程序可能还有各种bug,请大家多多包涵。相关问题欢迎留言或email联系讨论,谢谢! ==================================================================================源码

晨宇思远 5万+

【Linux系统】Kdenlive软件多机位同音频视频同步化处理

Kdenlive简介 官网链接:https://kdenlive.org/zh/ 命令行安装: apt-get install kdenlive Kdenlive能够进行多轨道视频编辑,可以使用和调整多条音频、视频轨道。每条轨道可以按需进行单独锁定、静音。 Kdenlive多机位同音频视频同步化处理步骤 1. 新建Kdenlive文件 选择<文件>-<新建>,建立新的kdenlive文件,初始设置为<视频轨:2>,<音频轨:2>。 视.

qq_31550269的博客 1886

善Java程序的151个建议_改善Java程序的151个建议 读后感

《编写高质量代码 改善Java程序的151个建议》是一本关于Java最佳实践的集大成之作,它从Java语言本身、Java程序的架构设计和思想、Java程序的编码规范和习惯等方面对151个经典的问题给出了解决方案,为Java开发者提高开发效率和编写高质量的Java代码提供了宝贵的建议。下面是本人的读后感:建议1:不要在常量和变量中出现易混淆的字母包名全小写,类名首字母全大写,常量全部大写并用下划线分...

weixin_29497751的博客 141

AgentFlow:模块化智能体框架与Flow-GRPO强化学习实战解析

在人工智能领域,大语言模型(LLM)与智能体(Agent)技术正推动着自动化任务处理的发展。其核心原理在于通过规划、执行与反馈的循环,使AI系统能够自主调用工具解决复杂问题。这一技术的价值在于突破单一模型的局限性,实现更可靠的多步骤推理。在实际应用中,智能体框架需要处理搜索、代码执行、数学计算等多种场景。本文聚焦的AgentFlow框架,正是通过模块化设计将智能体拆分为规划者、执行者、验证者和生成者四个专家模块,并引入Flow-GRPO强化学习算法进行流程内优化。该框架在搜索增强与工具调用等任务上展现出显著

weixin_42311427的博客 370

【编写高质量代码:改善Java程序的151个建议】第1章:Java开发中通用的方法和准则___建议14~20

作为一个由影视圈转行做Java的菜鸟来说,读书是很关键的,本系列是用来记录《编写高质量代码 改善java程序的151个建议》这本书的读书笔记。方便自己查看,也方便大家查阅。 建议14:使用序列化类的私有方法巧妙解决部分属性持久化问题 建议15:break万万不可忘 建议16:易变业务使用脚本语言编写 建议17:慎用动态编译 建议18:浅谈Java instanceof 建议19:断...

学Java,找哪吒 3597

RK3568平台(网络篇)添加网络交换芯片RTL8306M

该交换芯片支持I2C、SPI、mdio通信,但是看ast1520的uboot代码采用的是mdio去通信phy芯片的,所以暂时也先采用mdio的方式,需要配置相应的引脚才可以配置成mdio通信模式,具体的配置硬件工程师解决。RTL8306M芯片上可能没有提供MDC/MDIO接口,可以通过GPIO(General Purpose Input/Output)来模拟,GPIO可实现串行输入输出,且一般CPU上会提供很多GPIO接口供用户自定义使用。

weixin_49303682的博客 3938

二十一.基于国民MCU 的增加M4F DSP库调用的验证

Cortex-M4F内核不仅内置硬件FPU单元,还支持多种DSP指令集,比如支持单周期乘加指令(MAC)等。因此Cortex-M4执行所有的DSP指令集都可以在单周期内完成,而Cortex-M3和M0需要多个指令和多个周期才能完成同样的功能。比如开方运算,M3和M0只能通过迭代法(标准数学函数库)计算,而M4F直接调用VSQRT指令完成。参考:\Nationstech.N32G45x_Library.1.1.1\Nationstech.N32G45x_Library.1.1.1\projects\n32g4

AIoT深度探索者 | 嵌入式系统架构师 深耕物联网(IoT)与人工智能(AI)融合技术,聚焦​​边缘计算、图像开发、低功耗通信协议​​,致力于智能硬件,关注我获取最新技术文章信息与海量资源~ 934

改善Java程序的151建议_改善java程序的151个建议

《编写高质量代码-改善java程序的151个建议》--秦小波一、开发中通用的方法和准则1、不要在常量和变量中出现易混淆的字母long a=0l; --> long a=0L;2、莫让常量蜕变成变量static final int t=new Random().nextInt();3、三元操作符的类型无比一致int i=80;String s=String.valueOf(i<100?9...

weixin_39559369的博客 446

原理和代码解读:用Diffusion Models高清图像修复(Image Inpainting)

在最近的Diffusion Models应用中,Image Inpainting+ControlNet/Lora等工作在模特衣服生成、家居场景重建等场景中得到了广泛的应用。这篇博客主要介绍Diffusion Models如何在修复高清图像的。

沉迷单车的追风少年 2497

编写高质量代码:改善Java程序的151个建议

本系列是用来记录《编写高质量代码 改善java程序的151个建议》这本书的读书笔记。方便自己查看,也方便大家查阅。 全书共12章,共有151条建议,其中1~3章针对java语法本身提出了51条建议;第4~9章重点针对JDK API的使用提出了80条建议;第10~12章针对程序的性能、开源的工...

chetianyao8457的博客 352

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

[ 转 ]编写高质量代码:改善Java程序的151个建议

记得3年前刚到公司,同桌同事见我无事可做就借我看《编写高质量代码:改善Java程序的151个建议》这本书,当时看了几页没上心就没研究了。到上个月在公司偶然看到,于是乎又找来看看,我的天,真是非常多的干货,对于我这种静不下心的人真是帮助莫大呀。        看完整本书,也记了不少笔记,我就分享一部分个人觉得有意义的内容,也为了方便以后自己温习。--警惕自增陷阱i++表示先赋值后自增,而++i表示先

u011251014的博客 482

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

改善java代码的建议

这篇文章是在看

spyiu的专栏 1471

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

读-秦小波-编写高质量代码:改善java程序的151个建议

有些建议不太用到,但是用到的时候如果不注意就会进坑,所以书名改成java的151个坑更合适。 不要在常量和变量中出现易混淆的字母包名全小写,类名首字母全大写,常量全大写下划线分割,变量驼峰; 字母l作为长整形标志大写L; 莫让常量蜕变成变量常量final staic,一般不会,主要是值常量的值不要通过计算获取值,值应该在编译期确认,不要在运行期更改; 三元操作符的类型务必一致 – 不一致会做转换,

熊猫猫 3774

java 151建议_编写高质量代码改善java程序的151个建议——导航开篇

前言系列文章:下个星期度过这几天的奋战,会抓紧java的进阶学习。听过一句话,大哥说过,你一个月前的代码去看下,惨不忍睹是吧。确实,人和代码一样都在成长,都在变好当中。有时候只是实现功能的编程,长进不了呀。博客提供的好处就可以交流,讨论的学习方法你们应该知道。在这里,我会陆陆续续的进行对《编写高质量代码改善java程序的151个建议》看法,希望大家点击交流。正文看这本书原因1.项目做的只是实现功能...

weixin_39688170的博客 194

怎样才能写出漂亮高质量的java代码?改善JAVA程序的151个建议你看过吗,你想要的答案都在里面了!

怎么写高质量的代码是一个很大的话题,其实面向对象设计的很多原则都能够给我们写代码的时候提供指导,写代码的时候要时刻记得学以致用,而不是敷衍了事,专业的软件工程师必然要能写得一手好代码。

老男孩的架构路 649

《编写高质量代码:改善Java程序的151个建议》笔记

编写高质量代码:改善Java程序的151个建议笔记 第1章 Java开发中通用的方法和准则 1、包名全小写,类名首字母全大写,常量全部大写并且用下划线分隔,变量采用骆驼命名法命名等。 2、字母“l”(还包括大写字母“O”)尽量不要和数字混用。如果字母和数字必须混合使用,字母“l”务必大写,字母“O”则增加注释。 3、三元操作符的类型务必一致: public class Client {

50万+

编写高质量代码:改善Java程序的151个建议(第1章建议1~5)

本系类文章,用来记录《编写高质量代码 改善java程序的151个建议》这本书的读书笔记。由于篇幅原因本人将读书笔记采取分批记忆的方式来进行记录分享,全书共12章,共有151条建议,其中1-3章针对java语法本身提出了51条建议;第4~9章重点针对JDK API的使用提出了80条建议;第10~12章针对程序的性能、开源的工具和框架、编码风格和编程思想等方面提出了20条建议。本人根据此书的目录结构,循序渐进的阅读此书,特记录于此。

jjc4261的博客 238

《编写高质量代码:改善Java程序的151个建议》读书笔记

《编写高质量代码:改善Java程序的151个建议》读书笔记

biubiubiubibibi的博客 261

《改善Java程序的151个建议》读后感

(a):排序中不是英文的,中文排序可以用: Comparator<Object> col = Collator.getInstance(); Arrays.sort(arr, col); (b):ArrayList是个可变成的数组。默认长度为10,每当长度超过,则调用Array.cofyOf(),一次扩容1.5倍 (c):Set集合,元素不重复,且子类TreeSet自动排序,他下面的lower(xxx)方法,是:给出小于xxx的最大元素,用于求出第二大值 (d):Arrays的asList()方法,可以将数

bug的abc 451

改善Java程序的151个建议

建议1:不要在常量和变量中出现易混淆的字母 1、包名全小写,类名首字母大写,常量全部大写并用下划线分隔,变量才有驼峰命名法 2、举例(long类型数值后面小写l 和大写L的影响) public class TestDemo { public static void main(String[] args) { long i = 1l; // long i = ...

qq_37891300的博客 405

写代码质量改善java计划151建议——导航开始

2014-05-16 09:08 by Jeff Li 前言   系列文章:[传送门]   下个星期度过这几天的奋战,会抓紧java的进阶学习。听过一句话,大哥说过,你一个月前的代码去看下,慘不忍睹是吧。确实,人和代码一样都在成长,都在变好其中。有时候仅仅是实现功能的编程,长进不了呀。   博客提供的优点就能够交流。讨论的学习方法你们应该知道。...

aofan9566的博客 139
上一篇: 改善java程序的151个建议 读后感二
下一篇: 改善java程序的151个建议 读后感四
三易的博客
博客等级 码龄15年 42粉丝 89原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值