任何事情有可能出错,没错,的确如此。

这就是为什么我们要采用“防御性编程”,即一些偏执习惯的原因。下面是我个人认为的 10 个最有用但偏执的 Java 编程技术。一起来看一看吧:

1.将 String 字符串放在最前面

为了防止偶发性的 NullPointerException 异常,我们通常将 String 放置在 equals() 函数的左边来实现字符串比较,如下代码:

// Bad

if (variable.equals("literal")) { ... }

// Good

if ("literal".equals(variable)) { ... }

这是随便用脑子想想就可以做的事,从 Bad 版本的代码改写表达式到 Good 版本的代码,这中间并不会丢失任何东西。欢迎不同的观点…

2.不要相信早期的 JDK API

在 Java 早期,编程是一件非常痛苦的事情。那些 API 很不成熟,也许你已经碰到过下面的代码块:

String[] files = file.list();

// Watch out

if (files != null) {

for (int i = 0; i

...

}

}

看上去很偏执?也许吧,但请看 Javadoc:

如果这个虚拟路径不表示一个文件夹目录,则此方法返回 null。否则将会返回一个字符串数组,每一个字符串表示目录中的文件或文件夹。

对,没错。我们可以添加一些校验:

if (file.isDirectory()) {

String[] files = file.list();

// Watch out

if (files != null) {

for (int i = 0; i

...

}

}

}

3.不要相信 “-1”

我知道这是偏执的,但 Javadoc 中对 String.indexOf() 方法明确指出:对象内第一次出现指定字符的位置索引,如果为 -1 则表示该字符不在字符序列中。所以使用 -1 是理所当然的,对吗?我说不对,请看以下代码:

// Bad

if (string.indexOf(character) != -1) { ... }

// Good

if (string.indexOf(character) >= 0) { ... }

谁知道呢。也许到时候他们改变了编码方式,对字符串并不区分大小写,也许更好的方式是返回 -2?谁知道呢。

4.避免意外赋值

是的,这种事情也许经常会发生。

// Ooops

if (variable = 5) { ... }

// Better (because causes an error)

if (5 = variable) { ... }

// Intent (remember. Paranoid JavaScript: ===)

if (5 === variable) { ... }

所以你可以将比较常量放置在左侧,这样就不会发生意外赋值的错误了。

5.检查 Null 和 Length

无论如何,只要你有一个集合、数组等,请确保它存在,并且不为空。

// Bad

if (array.length > 0) { ... }

// Good

if (array != null && array.length > 0) { ... }

你并不知道这些数组从哪里来,也许是来自早期版本的 JDK API,谁知道呢。

6.所有的方法都是 final 的

你也许会告诉我你的开/闭原则,但这都是胡说八道。我不相信你(正确继承我这个父类的所有子类),我也不相信我自己(不小心继承我这个父类的所有子类)。所以对于那些意义明确的方法要严格用 final 标识。

// 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 = "...";

}

8.重载时不要相信泛型

是,它可以发生。你相信你写的超级好看的 API,它很直观,随之而来的,一些用户谁只是将原始类型转换成 Object 类型,直到那该死的编译器停止发牢骚,并且突然他们会链接错误的方法,以为这是你的错误。

看下面的代码:

// Bad

void bad(T value) {

bad(Collections.singletonList(value));

}

void bad(List values) {

...

}

// Good

final  void good(final T value) {

if (value instanceof List)

good((List>) value);

else

good(Collections.singletonList(value));

}

final  void good(final List values) {

...

}

因为,你知道……你的用户,他们就像:

// This library sucks

@SuppressWarnings("all")

Object t = (Object) (List) Arrays.asList("abc");

bad(t);

相信我。这一切我都看到过。

9.总是在 Switch 语句的 Default 中抛出异常

Switch 语句……它们其中一个可笑的语句我不知道该对它敬畏还是哭泣,但无论如何,既然我们坚持用 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 时,将会出现无法找到的提示,而不会让人不知所谓。

10.Switch 语句带花括号

事实上,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 语句甚至不是真正的语句,他们就像 goto 语句中的跳转标记一样。

结论

偏执编程看起来似乎不可思议,有时,因为代码经常被证明是更详细一点,但并不是需求需要。你可能会想,“哦,这是绝不会发生的”,但正如我所说。经过多年的编程,你不希望只修复这些愚蠢的 bug,因为编程语言是如此的陈旧的和有缺陷的。因为你知道…

现在到你了!什么是你在编程最偏执的怪癖?

java 编程技巧_一些实用的 Java 编程技巧相关推荐

  1. java实现计分_非常实用的java自动答题计时计分器

    该小程序使用java语言编写,让用户计算10以内的加减乘除法,特别适合小学开始学习加减乘除法的学生,能很好地锻炼他们的运算能力,并过计分计时的游戏性质引起学习兴趣! 运行该程序会弹出一个窗口,按ent ...

  2. java工具类_非常实用的Java工具类,拿走不谢(一)

    一.时间工具类:格式化时间.计算时间 (1)DateUtils.java package com.lhf; import java.text.SimpleDateFormat; /** * 日期格式化 ...

  3. java 判断类型_如何快速入门Java编程学习(干货)

    一.初识Java 1.生活中的程序: 从起床到教室上课的过程 穿衣打扮>起床>洗漱>出宿舍>>吃早餐>到教室 按照特定的顺序去完成某一件事的过程我们叫做生活中的程序 ...

  4. java编程赋值运算符_跟我学java编程—简单赋值运算符“=”

    赋值运算符是双目运算符,用在赋值表达式中.赋值运算符将值存储在运算符左边操作数指定的变量中.有两种赋值操作,简单赋值和复合赋值,简单赋值把运算符右边的操作数的值存储在运算符左边操作数指定的变量中:复合 ...

  5. java break语句_跟我学java编程—Java跳转语句—break语句

    有时可能不知道循环将要执行的次数,终止循环的条件可在以后确定,所以需要提供一种机制在条件满足的时候跳出循环.有时候,我们需要根据条件跳过循环中的一些语句.Java语言提供了break和continue ...

  6. 支持java虚拟主机_为何缺乏支持Java的虚拟主机

    现在很多站长们,都青睐于香港虚拟主机建站.现在常见的是asp和PHP的程序空间很多,但是Java的少之又少,下面小编我给大家聊一聊! 一.香港Java虚拟主机成本高 使用Java程序建站,就必须要用支 ...

  7. 做Java头发少_这35个Java代码优化细节,你用了吗

    链接:https://www.jianshu.com/p/6e472304b5ac 前言 代码 优化 ,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有 ...

  8. java必读书籍_最佳5本Java性能调优书籍–精选,必读

    java必读书籍 为什么Java开发人员应该阅读有关性能调优的书? 当我很久以前第一次面对这个问题时,我以为以后会做,但是我很长一段时间都没有回过头来. 仅当我在用Java编写的任务关键型服务器端财务 ...

  9. java future用法_纯干货:Java学习过程中的21个知识点和技术点

    我们在Java学习过程中要学会抓重点,善于总结,Java学习过程中常见的21个知识点和技术点你知道吗?下面和千锋广州小编一起来看看吧! 1. JVM相关 对于刚刚接触Java的人来说,JVM相关的知识 ...

最新文章

  1. js 获取元素的几种方法
  2. 5个很常用的CSS3网页小实例
  3. SIP协议状态码:480Temporarily Unavailable
  4. 2020年这10大机器学习研究最具影响力:为什么?接下来如何发展?
  5. IIS6.0,Apache低版本,PHP CGI 解析漏洞
  6. java21个知识点重点_java21个知识点重点
  7. jQuery扩展实现复选框批操作
  8. springboot+aop+自定义注解,打造通用的全局异常处理和参数校验切面(通用版)
  9. 38K红外遥控发射与接收电路设计与选型、正向压降、限流电阻、半值角
  10. Redis 缓存过期(maxmemory) 配置/算法 详解
  11. Nginx服务器学习(一)CentOS7系统安装Nginx
  12. jogamp-env.xml:48: Unsupported Java version: 11. Make sure that the version of the Java compiler is
  13. 程序员(应届生)求职简历模板+LaTex(overleaf)简历制作+博士简历模板分享+简历赏析
  14. matlab批量裁剪图像并保存,matlab批量裁剪tif图片
  15. linux中屏蔽定时任务,linux中的定时任务
  16. java栅格化,UI设计要不要用栅格化布局?
  17. H5拍照、选择图片上传组件核心
  18. 再次收到魅族公司赠送的一箱子礼物,感谢
  19. Android studio 设置豆绿色
  20. R语言进行中文分词和聚类

热门文章

  1. JAVA:实现十进制转八进制算法(附完整源码)
  2. html文件的ppt,html概述及HTML文件.ppt
  3. 总结JavaScript要点
  4. 书籍_《未来世界的幸存者》阮一峰--1/5
  5. 机械革命蛟龙7怎么样?测评值得买吗?详细性能点评
  6. 滤波、形态学腐蚀与卷积(合集)
  7. 【CSS】display常用属性
  8. linux文件系统简介_Linux文件系统简介
  9. 5个方法,教你用Python赚外快!
  10. JS验证邮箱格式是否正确的代码