有用但多疑的十大Java编程技术

article/2025/8/7 1:57:28

在编码过一段时间后(哎呀,拿我来说,已经20多年了,当你乐享其中时,时间过得飞快),有人已经开始拥抱他们的习惯了。
因为,你知道…

“会出错的事情总会出错”– 墨菲定律

这就是人们拥抱“自卫编程”,也就是多疑的习惯,有时有道理,有时更模糊。可能有一点奇怪当你想到一个人写这个的时候。
下面是我总结的10大有用但多疑的Java编程技术。开始吧:

1.优先放置字符常量

把String变量放在equals()方法的左边,对于预防偶然出现的空指针异常来说,从不是一个好主意。

// 错误
if (variable.equals("literal")) { ... }// 正确
if ("literal".equals(variable)) { ... }

这再明显不过了,把变量放在右边是更好的版本。

2.不要相信早期的JDK APIs

在Java的早期时代,编程肯定很痛苦。APIs是非常不成熟的,你可能遇到过下面这样的代码:

String[] files = file.list();// 小心
if (files != null) {for (int i = 0; i < files.length; i++) {...}
}

多疑了?可能吧,但是看看Javadoc:

“如果抽象的pathname没有指定一个目录,那么这个方法会返回null。否则会返回string数组,数组中的每一个string都是该目录下的文件或目录。

对了。最好再添加一个检查,只是为了确保安全起见。

if (file.isDirectory()) {String[] files = file.list();// 小心if (files != null) {for (int i = 0; i < files.length; i++) {...}}
}

3.不要相信“-1”

我知道这是多疑的。Javadoc中的 String.indexOf()方法是这样声明的:

“返回指定字符在字符序列中的第一次出现的位置,如果没有该字符,返回-1”

所以,-1就能打保票了吗?不能,考虑下面情况:

// 错误
if (string.indexOf(character) != -1) { ... }// 正确
if (string.indexOf(character) >= 0) { ... }

谁知道呢。可能在某些情况下他们还需要继续编码呢。另一个字符串可能包含是否检查大小写,空串(返回0),空值(异常)等情况,
这些都可能是一个返回-2的好例子,谁知道呢。

毕竟,我们讨论过无数次关于null的问题。为什么我们不开始讨论-1呢?在某种程度上,null也是基本数据类型的可选值吗?

4.避免意外赋值

假定下面是JavaScript,但是也让我们对这种语言多疑。

// 糟糕
if (variable = 5) { ... }// 好点 (因为会引发一个错误)
if (5 = variable) { ... }// 故意 (记住. 多疑的JavaScript: ===)
if (5 === variable) { ... }

再一次,如果你的等式中有常量,把它放到左边。如果你没把另一个=号加下,在这里你就可能意外的犯错。

5.检查null和length

无论什么时候遇到一个集合,数组等类型,确保它是存在且非空的。

// 错误
if (array.length > 0) { ... }// 正确
if (array != null && array.length > 0) { ... }

你永远不知道这些数组来自哪里。可能来自早期的Java APIs。

6.所有的方法都是final的

你能告诉我所有你想要的开闭原则,那是胡说。我不相信你(正确的继承了我的类)并且我不相信我自己(没有意外继承我的类)。
这就是为什么没有显式的使用子类型的方法都是final的。

// 错误
public void boom() { ... }// 正确,不能更改。
public final void dontTouch() { ... }

是的,这个方法是final的。如果这对你不起作用的话,修补它或重写字节码。或者发送一个特性请求。
尽管我确定你想要重写的意图不是一个好主意。

7.所有的变量和参数是final的

正如我刚才说到的,我不相自己。(不会意外的重写我的值)。既然都这么说了,我完全不相信我自己了。因为…

这里写图片描述

这也是为什么所有的变量和参数都要做成final的原因。

// 错误
void input(String importantMessage) {String answer = "...";answer = importantMessage = "LOL accident";
}// 正确
final void input(final String importantMessage) {final String answer = "...";
}

好,我承认。这个我没有经常应用在实际中,尽管,我真的应该使用。

8.重载时不要相信范型

// 错误
<T> void bad(T value) {bad(Collections.singletonList(value));
}<T> void bad(List<T> values) {...
}// 正确
final <T> void good(final T value) {if (value instanceof List)good((List<?>) value);elsegood(Collections.singletonList(value));
}final <T> void good(final List<T> values) {...
}

因为,你的用户,他们会像这样使用:

// 这个类库真烂
@SuppressWarnings("all")
Object t = (Object) (List) Arrays.asList("abc");
bad(t);

相信我。我看见过这种情况。包括像下面这样的:

这里写图片描述

还是多疑点好。

9.在switch上永远抛出默认值

// 错误
switch (value) {case 1: foo(); break;case 2: bar(); break;
}// 正确
switch (value) {case 1: foo(); break;case 2: bar(); break;default:throw new ThreadDeath("That'll teach them");
}

因为当value==3的那一刻,肯定会发生错误。不要说枚举,因为枚举也会发生这种情况。

10.switch要用大括号

事实上,对于那些喝醉了或打赌输了的人来说,switch是最邪恶的声明了。参考下面例子:

// 错误,不编译
switch (value) {case 1: int j = 1; break;case 2: int j = 2; break;
}// 正确
switch (value) {case 1: {final int j = 1;break;}case 2: {final int j = 2;break;}// 记住default: throw new ThreadDeath("That'll teach them");
}

在switch声明内,在所有的case声明中只有一个范围定义。事实上,这些case声明甚至不是真正的声明,它们更像是switch要被调用时的标签。

总结

多疑编程有时看起来有点奇怪,当经常这样编码时结果就是比实际需要的有一点冗余。你可能认为,“这种情况永远不可能发生”,但正如我之前所说的。在经过20左右的编程后,你只是不想再修复那些愚蠢且没必要存在的小错误,而只是因为古老有缺陷的语言造成的。
因为你懂的…

现在,轮到你了!

你在编程中最多疑的怪癖是什么?


http://chatgpt.dhexx.cn/article/th4ecWBU.shtml

相关文章

40000+字超强总结?阿里P8把Java全栈知识体系详解整理成这份PDF

40000 字长文总结&#xff0c;已将此文整理成PDF文档了&#xff0c;需要的朋友点赞支持一下吧。 全栈知识体系总览 Java入门与进阶面向对象与Java基础 Java 基础 - 面向对象Java 基础 - 知识点Java 基础 - 图谱 & Q/A 基础知识点复习完了以后&#xff0c;我们需要深入的理…

2020面试准备之Java 基础(理论篇)

文章目录 1、面向对象和面向过程的区别2、Java 语言有哪些特点?3、什么是 Java 虚拟机&#xff1f;为什么 Java 被称作是“平台无关的编程语言”&#xff1f;4、JDK 和 JRE 的区别是什么&#xff1f;5、Java 和 C的区别?6、面向对象的特征有哪些方面&#xff1f;7、访问修饰符…

资深程序员总结的成功十大黄金定律

《天下无贼》中由葛优饰演的黎叔曾说过一句话&#xff1a;“21世界什么最贵&#xff1f;——人才最贵。”人才对成功来说至关重要&#xff0c;而且人才和天才还是不一样的&#xff0c;天才大部分是要有天赋的&#xff0c;而人才即使你没有天赋&#xff0c;遵照规律发展&#xf…

什么是汉明窗?加Hanmming窗的作用?

1.什么是汉明窗&#xff1f; 从语音的角度说 理论&#xff1a; 语音信号是一种非平稳的时变信号&#xff0c;其产生过程与发声器官的运动紧密相关。而发声器官的状态变化速度较声音振动的速度要缓慢的多&#xff0c;因此语音信号可以认为是短时平稳的。研究发现&#xff0c;在…

hanmming窗和hamming窗的作用

什么是汉明窗&#xff1f;加Hanmming窗的作用&#xff1f; 1.什么是汉明窗&#xff1f; 答&#xff1a;我是做语音识别的&#xff0c;我就从语音的角度跟你说一下吧。 语音信号一般在10ms到30ms之间&#xff0c;我们可以把它看成是平稳的。为了处理语音信号&#xff0c;我们要对…

LFM回波信号仿真,加汉明窗,可用的matlab代码

LFM回波信号仿真&#xff0c;加汉明窗&#xff0c;可用的matlab代码 运行结果&#xff08;文尾有程序&#xff09; 在数字信号处理过程中&#xff0c;每次FFT变换只能对有限长度的时域数据进行变换&#xff0c;因此&#xff0c;需要对时域信号进行信号截断。 即使是周期信号&…

matlab汉明窗dft,谱分析中窗的选取

信号截断及能量泄漏效应 数字信号处理的主要数学工具是傅里叶变换,而傅里叶变换是研究整个时间域和频率域的关系。然而,当运用计算机实现工程测试信号处理时,不可能对无限长的信号进行测量和运算,而是取其有限的时间片段进行分析。取用有限个数据,就是将信号进行加窗函数操…

语音信号处理(二):矩形窗和汉明窗时域波形和频域波形

一&#xff1a;通过代码实现 clear all; hzeros(10000,1); h(2001:8000)1; % 在2001-8000上令值为1 subplot(2,2,1); plot(h,r-); title(矩形窗时域波形); xlabel(样点数); ylabel(幅度); hold on; axis([0 10000 0 1.5]);wh(2001:2060); Wfft(w,1024); % 对w进行1024点fft计…

语音识别之——mfcc什么是汉明窗,为什么加汉明窗

为什么要加汉明窗&#xff1f;什么叫加窗&#xff1f; 在信号处理中&#xff0c;可以说加窗处理是一个必经的过程&#xff0c;因为我们的计算机只能处理有限长度的信号&#xff0c;因此原始信号X(t)要以T&#xff08;采样时间&#xff09;截断&#xff0c;即有限化&#xff0c;…

窗方法原理之矩形窗及汉明窗

窗口设计法 窗口设计法是从单位脉冲响应着手&#xff0c;使h(n)逼近理想的单位脉冲响应序列hd(n)。我们知道hd(n)可以通过对理想频响求DTFT反变换获得 理想频响是分段恒定的&#xff0c;在边界频率处有突变点&#xff0c;所以&#xff0c;这样得到的理想滤波器单位脉冲响应hd(n…

【信号与系统】信号频谱和测量之汉明窗

【信号与系统】信号频谱和测量之汉明窗 信号频谱和测量傅里叶变换汉明窗汉明窗函数 频谱计算示例输入示例代码运行结果 示例2-书中示例参考资料 信号频谱和测量 傅里叶变换 汉明窗 实际情况中&#xff0c;由于无穷的积分范围问题&#xff0c;需要减少测量信号的时间&#xff…

matlab hamming 原理,Matlab中加汉明窗 ahmming 作用

转自:http://www.cnblogs.com/lxy2017/p/4049124.html 1.什么是汉明窗? 语音信号一般在10ms到30ms之间,我们可以把它看成是平稳的。为了处理语音信号,我们要对语音信号进行加窗,也就是一次仅处理窗中的数据。因为实际的语音信号是很长的,我们不能也不必对非常长的数据进行…

矩形窗、汉明窗效果对比(matlab)

直接上代码&#xff1a; clear all; close all; f11e3;f21.8e3; Fs6e3; M60;N2048; n0:M-1; xcos(2*pi*f1*n/Fs)0.05*cos(2*pi*f2*n/Fs); k0:N-1;DFs/N;%频谱分辨率 f1fft(x,2048);%加矩形窗DFT hmhamming(M);%汉明窗 f2fft(x.*hm,2048);%加汉明窗DFT plot(k*D,10*log10(abs(f…

Hamming(汉明)窗的原理介绍及实例解析

概念   在数字信号处理过程中&#xff0c;每次FFT变换只能对有限长度的时域数据进行变换&#xff0c;因此&#xff0c;需要对时域信号进行信号截断。即使是周期信号&#xff0c;如果截断的时间长度不是周期的整数倍&#xff08;周期截断&#xff09;&#xff0c;那么&#xff…

基于MATLAB的FIR滤波器性能仿真,对比矩形窗、汉明窗,海宁窗,布莱克曼窗

目录 一、理论基础 二、核心程序 三、测试结果 一、理论基础 矩形窗的优点是主瓣比较集中,缺点是旁瓣较高,并有负旁瓣,导致加窗过程中带进了高频干扰和频谱泄漏。 汉宁窗又称升余弦窗,汉宁窗使主瓣加宽并降低,旁瓣则显著减小,从减小泄漏观点出发,汉宁窗优于矩形窗。…

汉明窗试分析

I、预备知识&#xff1a; 1&#xff09;帧&#xff1a;简单说&#xff0c;有一段语音信号&#xff0c;分成很小的一段一段的等长的信号&#xff0c;这其中一段就是一帧。—通常一秒取约33帧到100帧&#xff0c;也就是说一帧大约时长为1s/100-1s/33。&#xff08;如下图为一段语…

一文读懂FFT,海宁窗(hann)和汉明窗(hamming)的区别,如何选择窗函数

一文读懂FFT&#xff0c;海宁窗&#xff08;hann&#xff09;和汉明窗&#xff08;hamming&#xff09;的区别 海宁窗和汉明窗时域波形频域响应matlab window 工具 如何选择窗 数字信号处理离不开频域分析&#xff0c;一定会用到FFT。做FFT之前又会用到窗函数。那么各种窗函数之…

FIR滤波器窗函数设计法——汉明窗设计实例

文章目录 前言一、FIR滤波器的设计方法1 窗函数设计法的原理2 窗函数的主要指标和设计方法3 汉明窗的特性和设计方法 二、汉明窗设计滤波器实例1.低通滤波器matlab示例2.高通滤波器matlab示例3.多通带滤波器matlab示例 前言 数字滤波器按单位抽样响应的时间特性可分为无限长单…

图像处理算法:最大类间方差法

转载于:https://www.cnblogs.com/abella/p/10646792.html

CV笔记5:图像分割之最大类间方差法、自适应阈值分割(基于python-opencv实现)

目录 一、简介 二、最大类间方差法&#xff08;大津法&#xff09; 2.1 最大类间方差法原理 2.2 基于opencv的实现&#xff08;简单阈值分割、Otsu阈值分割&#xff09; 三、自适应阈值分割 参考 一、简介 图像阈值化分割是一种传统的最常用的图像分割方法&#xff0c;因…