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);

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

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语句的神秘之处仅在于其强大功能。

这意味着无论我们是否发出break ,都会为所有不同情况定义变量final int j 。 不是很直观。 这就是为什么通过一个简单的block在每个case语句中创建一个新的嵌套作用域始终是一个好主意的原因。 (但不要忘记块内的break !)

结论

偏执狂编程有时看起来很奇怪,因为代码往往比实际需要的更为冗长。 您可能会想,“哦,这永远不会发生”,但是正如我所说。 经过20年左右的编程,您只是不想修复仅由于该语言太老又有缺陷而导致的那些愚蠢的,不必要的小错误。 因为你知道

现在轮到你了!

您在编程中最偏执的怪癖是什么?

翻译自: https://www.javacodegeeks.com/2015/08/top-10-useful-yet-paranoid-java-programming-techniques.html

java的网络编程有用吗

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

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

相关文章

未来五年有颠覆性的IT技术都在这里

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删据福布斯杂志报道&#xff0c;在美国奥兰多举行的Gartner研讨会上&#xff0c;市场研究机构Gartner Research的副总裁兼资深研究员大卫卡利&…

java ee maven_真正释放Maven和Java EE的强大功能

java ee maven如果野心和愿景太复杂而无法使用&#xff0c;则它们可能会淘汰伟大的解决方案。 尽管Maven和Java EE是在整个Java行业中都已建立的良好技术&#xff0c;但是使用它们并使用其作者打算使用的所有技术和模式来设计项目可能非常棘手。 在开发过程中途&#xff0c;由…

程序员们,想在双十一脱单?赶快跟我捯饬起来吧

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删生活中有很多男人一边抱怨自己不够洋气&#xff0c;找不到女票&#xff0c;另一方面又懒到宁肯在床上撸啊撸&#xff0c;也不愿意好好打扮自己。…

jboss8日志级别设置_罐中研讨会:设置JBoss BRMS全日研讨会

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

C语言编程时你常犯的18种错误

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删C语言的最大特点是&#xff1a;功能强、使用方便灵活。C编译的程序对语法检查并不象其它高级语言那么严格&#xff0c;这就给编程人员留下“灵活…

这些知识你都不知道,难怪说你学不懂C语言!

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删关于C语言的那些小知识&#xff0c;准备学习或者刚刚入门的你已经了解了吗&#xff1f;语言种类编译语言静态声明语言面向过程的编程语言环境工具…

图片识别出处_AI人脸识别

前言最近网络上爆火的藏族小哥哥丁真&#xff0c;大家都知道吗&#xff1f;十几天前凭借一张纯真、干净、帅气的脸霸屏各大短视频平台&#xff0c;连各大电视台新闻媒体都争相报道&#xff0c;这个藏族小伙瞬间火了&#xff01;&#xff01;网友们对于丁真的长相评价不一&#…

【从零开始学C语言】知识总结一:C语言的基本知识汇总

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删C语言是一种计算机程序设计语言。它既有高级语言的特点&#xff0c;又具有汇编语言的特点。它可以作 为系统设计语言&#xff0c;编写工作系统应…

排球分组循环交叉编排_同学!中国海洋大学第一届排球联赛等你来战!

New中国海洋大学第一届排球联赛开始啦比赛宗旨1亲爱的同学们&#xff1a;为增强学生凝聚力&#xff0c;加强新老生交流&#xff0c;促进各院系的友谊&#xff0c;培养同学们的团队精神&#xff0c;丰富同学们的课余生活&#xff0c;展示我校文体风采&#xff0c;特此举办本次中…

jolokia_使用WildFly 9和Jolokia监视DevOps样式

jolokiaDevOps是当今最热门的话题之一。 并且围绕它的广泛主题使您很难真正找到完整的描述或涵盖体面粒度的所有内容。 可以肯定的一件事是&#xff1a;最重要的部分之一是提供正确的度量标准和信息以监视应用程序。 Java EE和JMX 监视Java EE服务器的标准方法是JMX。 使用JCo…

计算机的本质是哲学

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删学什么抽象模型庄子说过吾生有崖&#xff0c;知无涯。以有限的生命去学习无尽的知识是很愚蠢的。所以&#xff0c;学习的终极目标一定不是知识本…

用户首次登录之前必须更改密码_技术丨带你玩转Win10系统的用户账户

由于微软关于Win10家庭版系统用户和组的功能设置&#xff0c;在一般情况下&#xff0c;用户无法直接进行用户账户的管理。但通过简单的设置&#xff0c;同样能够玩转Win10系统的用户账户。今天我们将探索并学习&#xff1a;如何实现用户账户的设置与更改。Microsoft账户登录首次…

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

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

很好玩的12个c语言面试题

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删12个C语言面试题&#xff0c;涉及指针、进程、运算、结构体、函数、内存&#xff0c;看看你能做出几个&#xff01;1.gets()函数问&#xff1a;请…

java 开发 jvm_Java开发人员应了解的JVM流行语

java 开发 jvm本文将与您分享一些JVM“流行语”&#xff0c;它们对于Java开发人员在执行任何JVM性能和垃圾回收调优之前理解和记住非常重要。 本文末尾还提供了一些技巧&#xff0c;包括一些高级性能调优最佳实践。 将来的文章中将探讨有关Oracle HotSpot并发GC收集器&#xff…

C/C++在Java、Android和Objective-C三大平台下实现混合编程

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删Android和iOS开发都支持C开发&#xff0c;可以一套代码多平台使用。同时C难以反编译的特性也可以为Android开发带来代码的保密&#xff0c;另一n…

vs不一致的行尾对话框怎么调出_SolidWorks工程图打开后图纸没有了空白了怎么办?还能找回来吗?...

SolidWorks工程图打开后图纸没有了空白了怎么办&#xff1f;还能找回来吗&#xff1f;答案是肯定的。不知道大家使用SolidWorks有没有遇到这种情况&#xff0c;如下图所示&#xff1a;就是我们本来画好标注好的工程图&#xff0c;竟然没了&#xff0c;怎么造成的呢&#xff1f;…

jpa 忽略bean_在WildFly上将JPA和CDI Bean与骆驼一起使用

jpa 忽略bean我并没有真正为此计划&#xff0c;但是在一个免费的会议月份中&#xff0c;我有机会进行了一些深入的探讨&#xff0c;并向您展示了WildFly-Camel子系统提供的WildFly魔术上的更多Camel。 商业背景 该演示来自Christina Lin在JBoss Demo-Central上的一个演示 。 她…

【如何系统地学习 C++ 语言】关于C++,有哪些你需要提前知道的知识?

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删C是一种通用的、面向对象的编程语言&#xff0c;可用于开发操作系统、游戏、图形用户界面、后端以及高性能系统和应用程序。所以&#xff0c;尽管…

【如何系统地学习 C++ 语言】从开发环境到C++进阶,应该怎么办?

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删开发环境如前面介绍的那样&#xff0c;C属于一种静态的编译型语言&#xff0c;所以&#xff0c;开发环境配置过程中就需要用到对应的编译器。C有…