java的网络编程有用吗_十大有用但又偏执的Java编程技术
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语句的神秘之处仅在于其强大功能。
这意味着无论我们是否发出break
,都会为所有不同情况定义变量final int j
。 不是很直观。 这就是为什么通过一个简单的block在每个case
语句中创建一个新的嵌套作用域始终是一个好主意的原因。 (但不要忘记块内的break
!)
结论
偏执狂编程有时看起来很奇怪,因为代码往往比实际需要的更为冗长。 您可能会想,“哦,这永远不会发生”,但是正如我所说。 经过20年左右的编程,您只是不想修复仅由于该语言太老又有缺陷而导致的那些愚蠢的,不必要的小错误。 因为你知道
现在轮到你了!
您在编程中最偏执的怪癖是什么?
翻译自: https://www.javacodegeeks.com/2015/08/top-10-useful-yet-paranoid-java-programming-techniques.html
java的网络编程有用吗
java的网络编程有用吗_十大有用但又偏执的Java编程技术相关推荐
- 十大有用但又偏执的Java编程技术
经过一段时间的编码(以我为例,大约20年左右,当您玩得开心时光飞逝),人们开始接受这些习惯. 因为,你知道... 任何可能出错的事情都会发生. 这就是为什么人们会采用"防御性编程" ...
- 【小家java】java9新特性(简述十大新特性) 褒贬不一
相关阅读 [小家java]java5新特性(简述十大新特性) 重要一跃 [小家java]java6新特性(简述十大新特性) 鸡肋升级 [小家java]java7新特性(简述八大新特性) 不温不火 [小 ...
- java 常见错误_Java常见错误的十大列表(前100名!)
java 常见错误 前10名名单非常受欢迎,有趣且内容丰富. 但是有很多! 如何选择合适的? 这是一个元前10名列表,可帮助您找到前10名的前10名列表. 在更令人讨厌的笔记上: SELECT TOP ...
- 【小家java】java10新特性(简述十大新特性) 小步迭代
相关阅读 [小家java]java5新特性(简述十大新特性) 重要一跃 [小家java]java6新特性(简述十大新特性) 鸡肋升级 [小家java]java7新特性(简述八大新特性) 不温不火 [小 ...
- java机器人编程简介_机器人十大流行编程语言的介绍及机器人编程系统以及操作方法...
"如果您问"机器人的最佳编程语言是什么?计算机视觉程序员会给出不同于认知机器人的答案.每个人都不同意什么是"最好的编程语言",语言首先学习,即使这是最现实的答案 ...
- java array 元素的位置_数据结构与算法:动态图解十大经典排序算法(含JAVA代码实现)...
点击上方"JAVA",星标公众号 重磅干货,第一时间送达 本文将采取动态图+文字描述+正确的java代码实现来讲解以下十大排序算法: 冒泡排序 选择排序 插入排序 希尔排序 归并排 ...
- JAVA十大排序算法动画_十大排序算法(java实现)
[前言]最近在重新研究算法,此篇博文供自己复习使用也为方便广大程序员同学!此文代码均为自己实现,通过对比经典解法校验,若有错请读者及时提出! - [对比分析图]首先,我们先来对比分析一下这十大排序算法 ...
- 摄影获得最佳图像的十大要诀_十大最佳应用程序性能管理工具
摄影获得最佳图像的十大要诀 Looking for Application Performance Management (APM) tools for your organization? Here ...
- 计算机编程课程顺序_您可以在2月开始免费在线编程和计算机科学课程
计算机编程课程顺序 Seven years ago, universities like MIT and Stanford first opened up free online courses to ...
最新文章
- java hashmapconcurrentHashmap源理
- dTree三级树形菜单
- hdu4506小明系列故事——师兄帮帮忙 (用二进制,大数高速取余)
- Framelayout
- Scrapy源码阅读分析_1_整体框架和流程介绍
- Cloud一分钟 | 误删生产数据库血案,顺丰高级工程师被开除;阿里巴巴暂停美国云计算扩张?阿里云总裁正式回应:“不会减少投入”...
- iscroll上拉加载、下拉刷新
- Mozilla Firefox 在用户访问被黑客攻击的网站时发出警告
- dubbo+zookeper与webservice的简单对比
- linux创建表空间 没有权限,ORA-12913: 无法创建字典管理的表空间
- CoAP协议学习笔记 3.2 CoAP协议翻译 DTLS加密
- 程序员相亲大曝光 女方:做底层架构,什么时候升嘞!emmmm
- Android 内部存储和外部存储
- 大学里,单身率最高的专业竟然是这些!
- Md5加密算法的原理及应用
- 最大似然估计,最大后验估计,贝叶斯估计联系与区别
- 硬方案——从数据采样到滤波要求,一步一步教你设计“抗混叠滤波器”
- 二次型对自变量向量的导数
- pyfolio教程2——第一个returns_tear_sheet
- VR购物兴起,难道百搭的VR技术要全面“入侵”生活了?
热门文章
- P4831-Scarlet loves WenHuaKe【组合数学】
- P4068-[SDOI2016]数字配对【二分,费用流】
- 2021牛客暑期多校训练营2 G.League of Legends(转化+单调队列)
- codeforces1453 D. Checkpoints
- 【双指针】Square Pasture G(P7153)
- 【线段树】FREQUENT - Frequent values(luogu-SP1684 / poj 3368)
- 初一模拟赛(5.4)
- HDU5322 - cdq分治FFT加速dp
- Hadoop的FileSystem.copyToLocalFile两个参数 空指针异常
- 最值得程序员get的30本行业干货