十大有用但又偏执的Java编程技术
经过一段时间的编码(以我为例,大约20年左右,当您玩得开心时光飞逝),人们开始接受这些习惯。 因为,你知道...
任何可能出错的事情都会发生。
这就是为什么人们会采用“防御性编程”的原因,即偏执狂的习惯有时会变得很有意义,有时会变得晦涩难懂和/或聪明,甚至当您想到编写它的人时也会有些怪异。 这是我个人列出的十大有用但又偏执的Java编程技术。 我们走吧:
1.首先将字符串文字
通过将String
文字放在equals()
比较的左侧,来防止偶发的NullPointerException
从来不是一个坏主意,如下所示:
// Bad
if (variable.equals("literal")) { ... }// Good
if ("literal".equals(variable)) { ... }
这很容易。 将表述从不太好的版本改写为更好的版本并不会丢失任何内容。 如果我们只有真正的期权 ,对吗? 不同的讨论…
2.不要相信早期的JDK API
在Java的早期,编程一定是一个很大的难题。 这些API仍然很不成熟,您可能会遇到以下一段代码:
String[] files = file.list();// Watch out
if (files != null) {for (int i = 0; i < files.length; i++) {...}
}
看起来偏执吗? 也许吧, 但阅读Javadoc :
如果此抽象路径名不表示目录,则此方法返回null。 否则,将返回一个字符串数组,该字符串数组用于目录中的每个文件或目录。
是的,对。 不过,最好确保再添加一张支票:
if (file.isDirectory()) {String[] files = file.list();// Watch outif (files != null) {for (int i = 0; i < files.length; i++) {...}}
}
mm! 编码Java列表时,违反了我们的10条最佳最佳实践中的规则5和6。 因此,请做好准备并添加该null
检查!
3.不要相信“ -1”
我知道这很偏执。 String.indexOf()
的Javadoc明确指出……
返回此对象表示的字符序列中字符首次出现的索引(如果没有出现,则返回-1)。
因此, -1
是理所当然的,对吧? 我说不。 考虑一下:
// Bad
if (string.indexOf(character) != -1) { ... }// Good
if (string.indexOf(character) >= 0) { ... }
谁知道。 也许他们需要在某个时间点进行ANOTHER编码,以便说,如果不区分大小写地检查, otherString
包含otherString
……也许是返回-2
的好例子? 谁知道。
毕竟, 关于十亿美元的错误 ,我们已经进行了数十亿次讨论,这是NULL
。 为什么我们不应该开始讨论-1
,它在某种程度上是原始类型int
的替代null
?
4.避免意外分配
是的 它发生的最好(尽管不是我。请参阅#7)。
(假设这是JavaScript,但是我们也要对语言保持偏执)
// Ooops
if (variable = 5) { ... }// Better (because causes an error)
if (5 = variable) { ... }// Intent (remember. Paranoid JavaScript: ===)
if (5 === variable) { ... }
再次。 如果您的表达式中有文字,请将其放在左侧。 当您打算添加另一个=
符号时,您不会在这里偶然出错。
5.检查空AND长度
只要有集合,数组等,请确保其存在且不为空。
// Bad
if (array.length > 0) { ... }// Good
if (array != null && array.length > 0) { ... }
您永远不知道这些数组从何而来。 也许来自早期的JDK API?
6.所有方法均为最终方法
您可以告诉我所有关于您的开放/封闭原则的信息,这些都是胡扯。 我不信任您(正确地扩展了我的课程),我也不信任自己(不偶然地扩展了我的课程)。 这就是为什么所有未明确打算用于子类型化的东西(即仅接口)都是final
。 另请参阅我们的《 编码Java的10个最佳最佳实践》列表中的第9条。
// Bad
public void boom() { ... }// Good. Don't touch.
public final void dontTouch() { ... }
是。 这是最终的。 如果那对您不起作用,请对其进行修补或检测,或重写字节码。 或发送功能请求。 我敢肯定,您要覆盖上述内容并不是一个好主意。
7.所有变量和参数均为最终变量
就像我说的。 我不信任自己(不会意外覆盖我的价值观)。 话虽如此,我一点也不相信自己。 因为…
…这就是为什么所有变量和参数也都设为final
。
// Bad
void input(String importantMessage) {String answer = "...";answer = importantMessage = "LOL accident";
}// Good
final void input(final String importantMessage) {final String answer = "...";
}
好吧,我承认。 尽管我应该这样做,但我确实很少经常申请。 我希望Java像Scala一样正确 ,人们只需在各处输入val
,甚至都不必考虑可变性–除非他们通过var
显式(很少!)使用它。
8.重载时不要相信泛型
是。 这有可能发生。 您相信您写的是一个超级棒的API,它完全摇摆并且完全直观,并且随之而来的是一些用户,将所有内容原始广播到Object
直到该织补编译器停止执行,然后突然他们会链接错误的方法,以为那是您的错误(总是如此)。
考虑一下:
// Bad
<T> void bad(T value) {bad(Collections.singletonList(value));
}<T> void bad(List<T> values) {...
}// Good
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) {...
}
因为,您知道……您的用户,他们就像
// This library sucks
@SuppressWarnings("all")
Object t = (Object) (List) Arrays.asList("abc");
bad(t);
相信我。 我已经看到了一切。 包括像
偏执是很好的。
9.始终打开默认开关
切换...这些滑稽的陈述之一,我不知道该敬畏地吓呆还是哭泣。 无论如何,我们被switch
困住了,所以我们最好还是在需要的时候把它弄对。 即
// Bad
switch (value) {case 1: foo(); break;case 2: bar(); break;
}// Good
switch (value) {case 1: foo(); break;case 2: bar(); break;default:throw new ThreadDeath("That'll teach them");
}
因为将value == 3
引入软件的那一刻,它一定会来! 不要说enum
,因为它会发生在enums
的!
10.用花括号切换
实际上, switch
是最醉人的说法,任何人在喝醉或打赌时都被允许进入一种语言。 考虑以下示例:
// Bad, doesn't compile
switch (value) {case 1: int j = 1; break;case 2: int j = 2; break;
}// Good
switch (value) {case 1: {final int j = 1;break;}case 2: {final int j = 2;break;}// Remember:default: throw new ThreadDeath("That'll teach them");
}
在switch
语句中,所有case
语句中仅定义了一个作用域。 实际上,这些case
语句甚至不是真正的语句,它们就像标签,并且switch
是goto调用。 实际上,您甚至可以将case
语句与令人惊讶的FORTRAN 77 ENTRY语句进行比较, FORTRAN 77 ENTRY语句的神秘之处仅在于其强大功能。
这意味着变量final int j
是针对所有不同情况定义的,无论我们是否发出break
。 不是很直观。 这就是为什么通过一个简单的block为每个case
语句创建一个新的嵌套作用域始终是一个好主意的原因。 (但不要忘记块内的break
!)
结论
有时偏执狂的编程似乎很奇怪,因为代码常常比实际需要的更为冗长。 您可能会想,“哦,这永远不会发生”,但是正如我所说。 经过20年左右的编程,您只是不想修复仅由于该语言太老和有缺陷而不再存在的那些愚蠢的,不必要的小错误。 因为你知道
现在轮到你了!
您在编程中最偏执的怪癖是什么?
翻译自: https://www.javacodegeeks.com/2015/08/top-10-useful-yet-paranoid-java-programming-techniques.html
十大有用但又偏执的Java编程技术相关推荐
- java的网络编程有用吗_十大有用但又偏执的Java编程技术
java的网络编程有用吗 经过一段时间的编码(以我为例,大约20年左右,当您玩得开心时光飞逝),人们开始接受这些习惯. 因为,你知道... 任何可能出错的事情都会发生. 这就是为什么人们会采用&quo ...
- 10个实用的但偏执的Java编程技术
在沉浸于编码一段时间以后(比如说我已经投入近20年左右的时间在程序上了),你会渐渐对这些东西习以为常.因为,你知道的-- 任何事情有可能出错,没错,的确如此. 这就是为什么我们要采用"防御性 ...
- Java编程技术_10个实用的但偏执的Java编程技术
在沉浸于编码一段时间以后(比如说我已经投入近20年左右的时间在程序上了),你会渐渐对这些东西习以为常.因为,你知道的-- 任何事情有可能出错,没错,的确如此. 这就是为什么我们要采用"防御性 ...
- 10个实用的但偏执的Java编程技术-扣丁学堂
10个实用的但偏执的Java编程技术 在沉浸于编码一段时间以后(比如说我已经投入近20年左右的时间在程序上了),你会渐渐对这些东西习以为常.因为,你知道的-- 任何事情有可能出错,没错,的确如此. 这 ...
- Java基础知识强化49:10个实用的但偏执的Java编程技术
1. 将String字符串放在最前面 为了防止偶发性的NullPointerException 异常,我们通常将String放置在equals()函数的左边来实现字符串比较,如下代码: 1 // Ba ...
- 安徽科技学院2017-2018-1学期15电信12《Java编程技术》期末考试
安徽科技学院2017-2018-1学期15电信12<Java编程技术>期末考试 缘分真是一个奇妙的东西,说来就来 可惜快乐的时光总是过得很快 JAVA程序设计课程就酱紫画上句号了,真的很不 ...
- JAVA 编程中的汉字处理(1)---java 编程技术中汉子问题的分析与解决
Java 编程技术中汉字问题的分析及解决 段明辉, 自由撰稿人 简介: 在基于 Java 语言的编程中,我们经常碰到汉字的处理及显示的问题.一大堆看不懂的乱码肯定不是我们愿意看到的显示效果,怎样才能够 ...
- java机器人编程简介_机器人十大流行编程语言的介绍及机器人编程系统以及操作方法...
"如果您问"机器人的最佳编程语言是什么?计算机视觉程序员会给出不同于认知机器人的答案.每个人都不同意什么是"最好的编程语言",语言首先学习,即使这是最现实的答案 ...
- 买什么数据结构与算法,这里有:动态图解十大经典排序算法(含JAVA代码实现)
上篇的动图数据结构反响不错,这次来个动图排序算法大全.数据结构与算法,齐了. 几张动态图捋清Java常用数据结构及其设计原理 本文将采取动态图+文字描述+正确的java代码实现来讲解以下十大排序算法: ...
最新文章
- 解决System.Data.SqlClient.SqlException (0x80131904): Timeout 时间已到的问题
- python天天学怎么样-Python天天学_01_基础1
- subplot 真正含义
- 物联网、云计算商用或从“家庭自动化”得以突破
- 经典动态规划:0-1 背包问题
- 汇编语言(三十五)之输入字符串以$结束然后输出字母个数
- 『总结』CSS/CSS3常用样式与web移动端资源
- 【C语言】-一维数组
- hawk物联网组态工具_物联网web组态网关在智慧农业中的应用
- ThinkPHP框架的增删改
- 优化iphone存储空间,以及优化iphone内存。
- 酒店网络营销的5C时代-德比软件 张焕杰
- android sqlite 示例,Android SQLite数据库操作示例
- 西瓜书——多元线性回归(知识点:多元实值函数凹凸性的证明)
- html颜色趋势,跟上色彩潮流!带你展望2015年的网页设计配色趋势
- U盘检测-linux+QT
- freemarker中local和assign标签区别
- 2020煤矿安全监测监控证考试及煤矿安全监测监控模拟考试题库
- SCI期刊名缩写查询
- 平面设计师经常去的网站——设计灵感类
热门文章
- centos7安装最新版node
- 第五章模糊查询和聚合函数
- ssm使用全注解实现增删改查案例——Emp
- javaWeb服务详解(含源代码,测试通过,注释) ——Dept的Service层
- 西瓜显示服务器错误,西瓜云服务器
- 圆心角 圆弧上点坐标_数控加工中心CNC的G02/G03圆弧指令的I、J、与R的区别
- 量角器中Selenium定位器的完整指南(示例)
- soapui 测试soap_使用SoapUI调用不同的安全WCF SOAP服务-基本身份验证,第一部分
- 开发罪过_七大罪过与如何避免
- java迭代器删除两个_两个迭代器的故事