StackOverflow 周报 - 第四周高质量问题的问答(Java、Python)
这是 Stack Overflow 第三周周报,由于本周周四外出,所以只有三篇内容。两篇 Java、一篇 Python。公众号「渡码」为日更,欢迎关注。
DAY1. 枚举对象 == 和 equals 区别
我们在比较枚举常量时可以使用 == 运算符或者 equals 方法,如:

先考虑第一个问题:为什么可以用 == 判断枚举常量相等?
我们都知道判断对象的相等应该用 equals 方法,== 只是判断对象的引用是否相等,枚举常量能够使用 == 判断相等是因为枚举常量除了定义时初始化的对象外,没有其他实例。例如:常量 APPLE 在定义时已经初始化,并且运行时不会再有其他的 APPLE 枚举常量。根据 JLS 文档,Java 通过以下四点保证枚举常量不存在定义之外的实例
- 试图显式实例化枚举类型是编译时错误,例如:new FRUITS()
- Enum 类中的 clone 方法确保永远不能克隆Enum常量,看看 clone 方法可以看到直接抛出 CloneNotSupportedException 异常
- 序列化机制的特殊处理确保不会因为反序列化而创建重复的实例
- 禁止枚举类型的反射实例化
因为枚举常量只有一个实例,因此可以直接用 == 判断枚举实例的相等。如果我们看下 equals 源码就可以发现它也是用 == 进行判断,所以我们考虑第二个问题:使用 == 和 equals 的区别是什么?
- == 不会抛出 NullPointerException 异常, 而 equals 会
- == 的类型不匹配在编译时检查,而 equals 不检查

因此使用 == 相比 equals 有以下优势:
- 更快
- 运行时更安全
- 编译时更安全
参考:
https://stackoverflow.com/questions/1750435/comparing-java-enum-members-or-equals
https://docs.oracle.com/javase/specs/jls/se9/html/jls-8.html#jls-8.9
DAY2. 用 Python 复制文件
我们都知道 Python 库非常强大,通常我们想实现一个功能基本都找到现成的库。今天我们就介绍 Python 标准库中的一个模块 —— shutil ,该模块中定义了文件复制的方法。如:复制一个文件,直接调一个函数即可

除了该函数, shutil 模块还定义了其他的函数提供文件复制的功能,但是细节略有不同,对比如下:

其中 copy2 复制的比较全面,估计性能也是比较低的。下面简单举两个例子对比一下不同函数的区别。
1. 目的路径是否是目录,copyfile vs copy2

2. 是否能复制 meta 数据,copyfile vs copy2

查看文件的 meta 信息,copyfile 复制的文件的更新时间是最新的, 而 copy2 复制的文件更新时间与源文件一样。
这里只举这两个例子,如对其他函数感兴趣可自行尝试。另外,shutil 模块应该还有其他更方便的函数可以供我们使用。总之使用 Python 开发效率还是挺高的,掌握 Python 确实能提高工作效率。
参考:
https://stackoverflow.com/questions/123198/how-do-i-copy-a-file-in-python
DAY3. 什么是 Java Bean
- 所有的属性是 private,提供 getter 和 setter 设置属性
- 有一个 public 无参构造函数
- 实现 Serializable 接口
Java Bean 其实是一种规范。对于我们学知识来说,往往想问为什么 Java Bean 定义这样的规范。对照上面三点,我的思考是这样的:
- getter/setter 方法为了对外暴露属性的读写接口,方便框架调用。同时,属性用 private 修饰可以提高安全性
- 之前的文章看过 Hadoop 框架反射的例子, public 无参构造可以很方便框架通过反射创建类实例
- 由于 web 框架通常需要数据传输,因此需要对象具有序列化与反序列化的能力
我们今天这篇文章比较简短,只是简单介绍了一下 Java Bean 规范的定义,并且谈了谈我自己的一些思考。
参考:
https://stackoverflow.com/questions/3295496/what-is-a-javabean-exactly
以上便是 Stack Overflow 的第四周周报,这周外出没带源文件, 代码从公众号复制的图片,请见谅。希望这些内容对你有用,后续会继续更新,如果想看日更内容欢迎关注公众号。
公众号「渡码」,分享更多高质量内容

StackOverflow 周报 - 第四周高质量问题的问答(Java、Python)的更多相关文章
- 编写高质量代码:改善Java程序的151个建议(第二章:基本类型)
编写高质量代码:改善Java程序的151个建议(第二章:基本类型) 目录 建议21:用偶判断,不用奇判断 建议22:用整数类型处理货币 建议23:不要让类型默默转换 建议24:边界还是边界 建议25: ...
- 编写高质量代码:改善Java程序的151个建议(第一章:JAVA开发中通用的方法和准则)
编写高质量代码:改善Java程序的151个建议(第一章:JAVA开发中通用的方法和准则) 目录 建议1: 不要在常量和变量中出现易混淆的字母 建议2: 莫让常量蜕变成变量 建议3: 三元操作符的类型务 ...
- StackOverflow 周报 - 高质量问题的问答(Java、Python)
这是 Stack Overflow 第三周周报,本周加入了 Python 的内容,原计划两篇 Java.两篇 Python.但明天过节所以今天就先把周报发了,两篇 Java.一篇 Python.公众号 ...
- 《编写高质量代码:改善Java程序的151个建议》笔记
To fight the unthinkable,you have to be willing to do the unthinkable. 不要在循环中使用try catch,应该放在循环的外面 ...
- StackOverflow 周报 - 这些高关注的问题你是否都会
我从 Stack Overflow 上找的了一些高关注度且高赞的问题.这些问题可能平时我们遇不到,但既然是高关注的问题和高点赞的回答说明是被大家普遍认可的,如果我们提前学到了以后不管工作中还是面试中处 ...
- StackOverflow 周报 - 与高关注的问题过过招(Java)
本篇文章是 Stack Overflow 周报的第二周,共收集了 4 道高关注的问题和对应的高赞回答.公众号「渡码」为日更,欢迎关注. DAY1. serialVersionUID 的重要性 关注: ...
- 如何编写高质量的 JS 函数(4) --函数式编程[实战篇]
本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/ZoXYbjuezOWgNyJKmSQmTw作者:杨昆 [编写高质量函数系列],往期精彩内容: ...
- 怎样编写高质量的java代码
代码质量概述 怎样辨别一个项目代码写得好还是坏?优秀的代码和腐化的代码区别在哪里?怎么让自己写的代码既漂亮又有生命力?接下来将对代码质量的问题进行一些粗略的介绍.也请有过代码质量相关经验的朋友 ...
- 如何写出高质量的技术博客 这边文章出自http://www.jianshu.com/p/ae9ab21a5730 觉得不错直接拿过来了 好东西要大家分享嘛
如何写出高质量的技术博客?答案是:如果你想,就一定能写出高质量的技术博客.看起来很唯心,但这就是事实.有足够愿力去做一件目标明确,有良好反馈系统的事情往往很简单.就是不停地训练,慢慢地,你自己 ...
随机推荐
- ZooKeeper系列(二)—— Zookeeper 单机环境和集群环境搭建
一.单机环境搭建 1.1 下载 下载对应版本 Zookeeper,这里我下载的版本 3.4.14.官方下载地址:https://archive.apache.org/dist/zookeeper/ # ...
- ZooKeeper实现生产-消费者队列
[欢迎关注公众号:程序猿讲故事 (codestory),及时接收最新文章] 生产-消费者队列,用于多节点的分布式数据结构,生产和消费数据.生产者创建一个数据对象,并放到队列中:消费者从队列中取出一个数 ...
- Amazon S3 分布式存储的 python 接口实现
Amazon s3 是一种分布式的对象存储.用键值对的方式,来存储数据.其中,存入的所有数据都是一个对象(object),每一个对象都有一个键(key)存在. 具有非常方便的 web 访问接口,以及权 ...
- Mybatis mapper动态代理的原理详解
在开始动态代理的原理讲解以前,我们先看一下集成mybatis以后dao层不使用动态代理以及使用动态代理的两种实现方式,通过对比我们自己实现dao层接口以及mybatis动态代理可以更加直观的展现出my ...
- python+appium自动化测试(一)-----环境搭建
基础背景: windows7系统 +python3.4版本 环境搭建目标: 使用python编写app自动化测试脚本并成功执行. 搭建步骤: 1.安装python3,安装步骤详见:https:// ...
- LoRaWAN调试踩坑心得(一)
先说两句 在调试和移植的过程中 我们经常想用节点去抓上行包 或者去抓下行包 但在抓取的过程中发现,上行包抓取不到到,或是下行包抓取不到,或者是两个都抓取不到,觉得非常的诡异.明明接收频点.BW和SF都 ...
- HBase 系列(四)—— HBase 集群环境配置
一.集群规划 这里搭建一个 3 节点的 HBase 集群,其中三台主机上均为 Regin Server.同时为了保证高可用,除了在 hadoop001 上部署主 Master 服务外,还在 hadoo ...
- SpringBoot 配置 AOP 打印日志
在项目开发中,日志系统是必不可少的,用AOP在Web的请求做入参和出参的参数打印,同时对异常进行日志打印,避免重复的手写日志,完整案例见文末源码. 一.Spring AOP AOP(Aspect-Or ...
- 基于STM32F429和Cube的ov2640程序
1.ov2640和DCMI介绍 OV2640 是 OV(OmniVision)公司生产的一颗 1/4 寸的 CMOS UXGA(1632*1232)图 像传感器.该传感器体积小.工作电压低,提供单片 ...
- java学习之- 线程继承Thread类
标签(空格分隔): 线程 在java.lang包中有个Thread子类,大家可以自行查阅文档,及范例: 如何在自定义的代码中,自定义一个线程呢? 1.通过对api的查找,java已经提供了对线程这类事 ...