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编程技术相关推荐

  1. 十大有用但又偏执的Java编程技术

    经过一段时间的编码(以我为例,大约20年左右,当您玩得开心时光飞逝),人们开始接受这些习惯. 因为,你知道... 任何可能出错的事情都会发生. 这就是为什么人们会采用"防御性编程" ...

  2. 【小家java】java9新特性(简述十大新特性) 褒贬不一

    相关阅读 [小家java]java5新特性(简述十大新特性) 重要一跃 [小家java]java6新特性(简述十大新特性) 鸡肋升级 [小家java]java7新特性(简述八大新特性) 不温不火 [小 ...

  3. java 常见错误_Java常见错误的十大列表(前100名!)

    java 常见错误 前10名名单非常受欢迎,有趣且内容丰富. 但是有很多! 如何选择合适的? 这是一个元前10名列表,可帮助您找到前10名的前10名列表. 在更令人讨厌的笔记上: SELECT TOP ...

  4. 【小家java】java10新特性(简述十大新特性) 小步迭代

    相关阅读 [小家java]java5新特性(简述十大新特性) 重要一跃 [小家java]java6新特性(简述十大新特性) 鸡肋升级 [小家java]java7新特性(简述八大新特性) 不温不火 [小 ...

  5. java机器人编程简介_机器人十大流行编程语言的介绍及机器人编程系统以及操作方法...

    "如果您问"机器人的最佳编程语言是什么?计算机视觉程序员会给出不同于认知机器人的答案.每个人都不同意什么是"最好的编程语言",语言首先学习,即使这是最现实的答案 ...

  6. java array 元素的位置_数据结构与算法:动态图解十大经典排序算法(含JAVA代码实现)...

    点击上方"JAVA",星标公众号 重磅干货,第一时间送达 本文将采取动态图+文字描述+正确的java代码实现来讲解以下十大排序算法: 冒泡排序 选择排序 插入排序 希尔排序 归并排 ...

  7. JAVA十大排序算法动画_十大排序算法(java实现)

    [前言]最近在重新研究算法,此篇博文供自己复习使用也为方便广大程序员同学!此文代码均为自己实现,通过对比经典解法校验,若有错请读者及时提出! - [对比分析图]首先,我们先来对比分析一下这十大排序算法 ...

  8. 摄影获得最佳图像的十大要诀_十大最佳应用程序性能管理工具

    摄影获得最佳图像的十大要诀 Looking for Application Performance Management (APM) tools for your organization? Here ...

  9. 计算机编程课程顺序_您可以在2月开始免费在线编程和计算机科学课程

    计算机编程课程顺序 Seven years ago, universities like MIT and Stanford first opened up free online courses to ...

最新文章

  1. java hashmapconcurrentHashmap源理
  2. dTree三级树形菜单
  3. hdu4506小明系列故事——师兄帮帮忙 (用二进制,大数高速取余)
  4. Framelayout
  5. Scrapy源码阅读分析_1_整体框架和流程介绍
  6. Cloud一分钟 | 误删生产数据库血案,顺丰高级工程师被开除;阿里巴巴暂停美国云计算扩张?阿里云总裁正式回应:“不会减少投入”...
  7. iscroll上拉加载、下拉刷新
  8. Mozilla Firefox 在用户访问被黑客攻击的网站时发出警告
  9. dubbo+zookeper与webservice的简单对比
  10. linux创建表空间 没有权限,ORA-12913: 无法创建字典管理的表空间
  11. CoAP协议学习笔记 3.2 CoAP协议翻译 DTLS加密
  12. 程序员相亲大曝光 女方:做底层架构,什么时候升嘞!emmmm
  13. Android 内部存储和外部存储
  14. 大学里,单身率最高的专业竟然是这些!
  15. Md5加密算法的原理及应用
  16. 最大似然估计,最大后验估计,贝叶斯估计联系与区别
  17. 硬方案——从数据采样到滤波要求,一步一步教你设计“抗混叠滤波器”
  18. 二次型对自变量向量的导数
  19. pyfolio教程2——第一个returns_tear_sheet
  20. VR购物兴起,难道百搭的VR技术要全面“入侵”生活了?

热门文章

  1. P4831-Scarlet loves WenHuaKe【组合数学】
  2. P4068-[SDOI2016]数字配对【二分,费用流】
  3. 2021牛客暑期多校训练营2 G.League of Legends(转化+单调队列)
  4. codeforces1453 D. Checkpoints
  5. 【双指针】Square Pasture G(P7153)
  6. 【线段树】FREQUENT - Frequent values(luogu-SP1684 / poj 3368)
  7. 初一模拟赛(5.4)
  8. HDU5322 - cdq分治FFT加速dp
  9. Hadoop的FileSystem.copyToLocalFile两个参数 空指针异常
  10. 最值得程序员get的30本行业干货