十大有用但又偏执的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);

相信我。 我已经看到了一切。 包括像

7h6fah71

偏执是很好的。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/357690.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NGUI 3.5教程(二)Label 标签 (Hello world)、多行文本

写在前面&#xff1a; 本文将创建NGUI的第一个样例。依照编程传统&#xff0c;第一个样例&#xff0c;就是做一个Hello world 显示出来。NGUI。我们用Label来实现 。欢迎大家纠错、拍砖&#xff01;原创非常辛苦&#xff0c;如有转载&#xff0c;请注明出处&#xff1a;htt…

linux下php可以实现哪些功能,基于Linux的远程管理系统的设计与实现(PHP)

基于Linux的远程管理系统的设计与实现(PHP)来源&#xff1a;2BYSJ.cn 资料编号&#xff1a;2SJ260700 资料等级&#xff1a;★★★★★ %D7%CA%C1%CF%B1%E0%BA%C5%A3%BA2SJ260700以下是资料介绍,如需要完整的请充值下载. 本资料已审核过,确保内容和网页里介绍一致. 密 惠1.无需…

tostring 16进制_ToString:身份哈希码的十六进制表示形式

tostring 16进制我以前在方便的Apache Commons ToStringBuilder上写过博客&#xff0c;最近有人问我&#xff0c;在生成的String输出中出现的看似神秘的文本是什么构成的。 询问该问题的同事正确地推测出他正在查看的是哈希码&#xff0c;但与他的实例的哈希码不匹配。 我解释说…

前端工程师应该掌握哪些技能才方便找工作?

作为前端工程师,必须掌握到一定的技能才方便找工作,找高薪工作,你需要掌握这些技能。 高清思维导图下载:https://download.csdn.net/download/weixin_41937552/14752706 目录 HTML5+CSS3 移动Web网页开发

延迟分析中的案例研究:锁定与同步

特别是在这篇文章中&#xff0c;我们将讨论&#xff1a; java.concurrent.Lock创建的垃圾 比较锁与同步 如何以编程方式测量延迟 争用对锁和同步的影响 协调遗漏对延迟测试的影响 回到我最喜欢的主题之一&#xff0c;垃圾创建/分配。 有关此主题的更多详细信息&#xff0…

思维脑图——数据分析实战(最新版)

导读:数据分析是指用适当的统计分析方法对收集来的大量数据进行分析,提取有用信息和形成结论而对数据加以详细研究和概括总结的过程。 在统计学领域,将数据分析划分为描述性统计分析、探索性数据分析以及验证性数据分析,探索性数据分析侧重于在数据之中发现新的特征,而验证…

java实现一个旅游网站

导读:采用JSP和Java语言以及html脚本语言,同时采用B/S模式,进行各个界面和每个功能的设计与实现,后台管理与设计选用了SQL Server 2005数据库,前台设计与后台管理相结合,共同完成各功能模块的功能。 目录 基本功能 项目结构 项目截图

【收藏】Android屏幕适配全攻略(最权威的Google官方适配指导)

来源&#xff1a;http://blog.csdn.net/zhaokaiqiang1992 更多&#xff1a;Android AutoLayout全新的适配方式&#xff0c; 堪称适配终结者 Android的屏幕适配一直以来都在折磨着我们这些开发者&#xff0c;本篇文章以Google的官方文档为基础&#xff0c;全面而深入的讲解了And…

精通推荐算法1:为什么需要推荐系统(系列文章,建议收藏)

作者简介&#xff1a; 腾讯算法研究员。硕士毕业于中国科学院大学。在阿里和腾讯工作多年&#xff0c;拥有丰富的搜索和推荐算法经验。CSDN博客专家&#xff0c;原创文章100篇。发表专利15个&#xff0c;其中已授权6个。 系列文章&#xff0c;欢迎关注 精通推荐算法1&#x…

spring 开发环境_设置Spring 3开发环境

spring 开发环境本教程简要说明了如何设置典型的环境来开发基于Spring的应用程序。 除了可以正常工作的Windows XP客户端具有足够的CPU能力和内存外&#xff0c;本教程没有其他先决条件。 在教程中&#xff0c;我们将需要安装以下组件&#xff1a; Java 6 JDK更新26 适用于Jav…

Java+SSM+Oracle+Navicat+Eclipse+Microsoft Visio实现网上招聘系统

导读:整体基于B/S架构,采用MyBatis框架,运用Java中的Servlet、Jsp等关键技术,并结合Oracle数据库的使用,为招聘者和求职者搭建了一个高效、便利的网络平台。本系统分别为求职者和招聘者提供了信息注册功能,登录功能和信息维护功能。除此之外,求职者可以选择发布、撤销或…

友盟U-share sdk 分享的接入(支持Android及IOS)

导读:公司的原生开发的APP有块功能原来需要分享小程序到微信,现在改成分享成H5的形式,携带的参数不讨论,这里记录一下。 官方文档:https://developer.umeng.com/docs/128606/detail/129137 安卓分享H5:https://developer.umeng.com/docs/128606/detail/193883#h2-u5206u4E…

javaScript中const,var,let区别与用法详解

业务场景:今天想从正则表达式数组对象取出几个参数的值,发现好多人都用的const声明的变量,这里一起总结一下吧。 上一篇——》前端使用正则表达式获取地址栏URL参数的值并将需要的参数值展示在页面 场景: 查阅相关资料,总结一下js中三种定义变量的方式const, var, let的…

使用Java和Spring构建现代Web应用程序

使用Spring Framework创建Java Web应用程序从未如此简单。 如果您已经熟悉Java并且几乎没有创建Web应用程序的经验&#xff0c;或者如果您担心所有很酷的孩子都放弃Java取而代之的是Ruby和Node.js&#xff0c;那么您想读这篇。 我的意图是在此处提供实用指南&#xff0c;以快速…

mil跟踪算法matlab,几种目标跟踪算法性能比较

这是我自己的跟踪算法%%******************************************* 实验设置 *********************************************%%clc;clear all;%%******Change title to choose the sequence you wish to run******%%%title animal;% title board;% title car11;%title …

大前端工程师进阶之路,Node全栈为前端带来更多可能

导读:对那些刚入门前端的开发者来说,前端是一个“令人畏惧”的领域,尤其是在你看到前端的技能图谱时,你会发出这样的感叹,前端怎么有那么多的东西要学?我应该从何处学起?我又该如何应对千变万化的前端技术? 目录 如何选择? 关于变化

论赵泽彬多终端应⽤下的架构设计

导读: 1.应⽤特点及关键问题 2.解决思路及实现⽅案 3.实践效果及未来⽅向

罐中研讨会:设置JBoss BRMS全日研讨会

是否在寻找一种简单的方法来宣传&#xff0c;展示或演示使用JBoss业务规则管理系统&#xff08;BRMS&#xff09;产品的入门难度&#xff1f; 别无所求&#xff0c;因为我们召集了这个研讨会&#xff0c;因此您可以围绕JBoss BRMS构建一个晚上&#xff0c;半天或全天的学习课程…

论AI在叮咚智能音箱中的演进和应用

导读:顶级科技公司都在抢夺智能语音交互的入口权。比如小米,阿里,亚马逊,搜狗等

Robotium双client測试框架

互联网的本质就是信息交换。移动互联网更是如此&#xff0c; 所以很多移动互联网的服务类应用中有着身份地位不同的两种用户(比如:交易中的买家和卖家, 教学中的老师和学生, 打车中的车主和乘客)。近期的工作是给公司的某个产品建立android客户端測试框架&#xff0c;使用的自己…