做短,但做对!

编写简洁,优雅,清晰的代码一直是开发人员的艰巨任务。 您的同事不仅会感谢您,而且您会惊讶地发现,不断期待着重构解决方案以更少的代码完成更多(或至少相同)的工作是多么令人兴奋。 曾经有人说好的程序员是懒惰的程序员。 是的,是的。。。但是,真正优秀的程序员正在为它增添美感 。

在我关于JCG的第一篇文章中,我想向您展示如何利用Java语言的强大功能轻松地提高代码的可读性,即使是非常基本的事情。

让我们从一个具体的例子开始:

String color = "green";
...
if  ( color!=null && color.equals("red") ) {System.out.println("Sorry, red is forbidden !");
}

您可能从Java(或面向对象编程)老师那里学到的第一课是在对象上调用方法之前测试对象的无效性的重要性。 空指针异常(NPE)确实是面向对象语言的代码中最常见(最令人讨厌)的错误。

在上面的示例中,可以安全地将'color'字符串对象与常量进行比较之前确保其不为null。 我个人一直认为这是程序员的不必要负担,尤其是对于Java等现代OO语言而言。 解决方法是,存在一个(确实很愚蠢的)技巧来重写条件而不必测试无效性。 请记住, equals()方法是对称的(如果a = b则b = a)。

if  ( "red".equals(color) ) {System.out.println("Sorry, red is forbidden !");
}

乍一看,在阅读时可能会有些反常 ,但是消除污染代码当然也不是一文不值。

让我们继续我们的示例,并假设我们现在想将我们的颜色与多个值进行比较。 Java初学者通常会编写如下内容:

if ( "red".equals(color) ||"yellow".equals(color) ||"blue".equals(color) ) {System.out.println("This is a primary color");
}

我有时会遇到经验丰富的Java程序员,他们用以下代码缩短了很长的if语句:

if ( "red|yellow|blue".indexOf(color)>=0 ) {System.out.println("This is a primary color");
}

聪明吗? 实际上没有那么多。 与子字符串一起玩可能是一个危险的游戏。 例如,以下代码可能不会给出预期的结果,特别是如果您是男人:

String type = "man";
...
if ( "woman|child".indexOf(type)>=0 ) {System.out.println("Women and children first !");
}

如果您希望在美观和可读性之间找到良好的平衡,则最好选择以下替代方法之一。

import java.util.HashSet;
import java.util.Set;public static final Set<string> PRIMARY_COLORS;
static {PRIMARY_COLORS = new HashSet<string>();PRIMARY_COLORS.add("red");PRIMARY_COLORS.add("yellow");PRIMARY_COLORS.add("blue");
}
...
if ( PRIMARY_COLORS.contains(color) ) {System.out.println("This is a primary color");
}

很少有人知道这一点(我承认语法有点奇怪),但是在初始化“原色 ”时仍然有一种减少代码冗长的方法:

public static final Set<string> PRIMARY_COLORS = new HashSet<string>() {{ add("red"); add("yellow"); add("blue"); 
}};

如果对代码的简洁性变得痴迷,那么Java Collections Framework也可以解决:

import java.util.Arrays;
import java.util.Collection;public static final Collection<string> PRIMARY_COLORS = Arrays.asList("red", "yellow", "blue");
...
if ( PRIMARY_COLORS.contains(color) ) {System.out.println("This is a primary color");
}

final关键字可防止将PRIMARY_COLORS变量重新分配给另一个值集合-当将变量定义为public时,这一点尤其重要。 如果安全是主要问题,则还应将原始集合包装为不可修改的集合。 这将保证只读访问。

import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;public static final Collection PRIMARY_COLORS =Collections.unmodifiableCollection( Arrays.asList("red", "yellow", "blue") );

必须注意,尽管更易读,但使用值的集合(尤其是大型集合)通常会比(而不是像)经典的惰性 OR(即使用'||'而不是' |'),因为存在短路 评估 。 我倾向于认为如今这种考虑是徒劳的。

经过16年的抱怨,Java 7终于有了! –在switch-case语句中引入了对String的支持。 这使我们可以编写如下代码:

boolean primary;
switch(color) {case "red":primary=true; break;case "green":primary=true; break;case "blue":primary=true; break; default:primary=false;
}
if (primary) System.out.println("This is a primary color");

让我们最后以解决我们(可以这么说)问题的最面向对象的解决方案作为结尾。 Java枚举主要是类,因此可以像其他任何类一样具有方法和字段。 通过应用Template Method设计模式 ,可以定义一种抽象方法(对测试进行建模),该方法必须由所有子类实现(对应用于枚举的特定项的测试响应进行建模):

Color c = Color.valueOf("RED");
if ( c.isPrimaryColor() ) {System.out.println("This is a primary color");
}public enum Color {RED() {@Override public boolean isPrimaryColor() {return true;}},BLUE() {@Override public boolean isPrimaryColor() {return true; }},YELLOW() {@Override public boolean isPrimaryColor() {return true; }};GREEN() {@Override public boolean isPrimaryColor() {return false; }};public abstract boolean isPrimaryColor();
}

生成的代码是清晰的并且具有自我说明性。 在许多情况下,使用此模式可以替代更常见的“ if – else if”逻辑,因为它更易于阅读,扩展和维护。

总而言之,我想说,对于一个问题,在很多情况下(就实现而言),存在着许多不同的解决方案,而这正是Java语言的强大功能。 但是,决定哪个最好是另一个故事……

参考: 简短但正确! 来自我们的W4G合作伙伴 Bernard Ligny 。

相关文章 :

  • Java中的低GC:使用原语而不是包装器
  • Java Lambda语法替代
  • JVM如何处理锁
  • Java Fork / Join进行并行编程
  • Java最佳实践系列
  • 如何在Java中获得类似于C的性能

翻译自: https://www.javacodegeeks.com/2011/09/do-it-short-but-do-it-right.html

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

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

相关文章

math

莫比乌斯反演&#xff1a; $F(n) \sum\limits_{d|n} {f(d)} \Leftrightarrow \sum\limits_{d|n} {\mu (d)F(\frac{n}{d})} $ 其中 ${\mu (d)}$为莫比乌斯函数: 若$d$等于0 , 则${\mu (d)}$1 若$d {p_1}{p_2}{p_3}...{p_k}$ , ${p_i}$为互异质数&#xff0c;则${\mu (d)}$${( …

(笔试题)二进制1的个数相同的距离最小数

题目&#xff1a; 输入&#xff1a;整数A输出&#xff1a;整数B条件&#xff1a;A和B的二进制1的个数相同&#xff0c;且A和B之间的距离|A-B|最小。思路&#xff1a; 题目没有说明整数类型&#xff0c;这里认为是带符号的整数&#xff0c;即区分正负数。 根据题意&#xff0c;A…

Java Swing –日期选择器对话框

房子里有Swing开发人员吗&#xff1f; 对于使用Swing的用户来说&#xff0c;这是一个GUI组件&#xff0c;可能会对您的UI编码工作有所帮助。 我们的JCG合作伙伴之一提供了日期选择器小部件。 一探究竟&#xff1a; Java Swing –日期选择器对话框以选择日期 翻译自: https://…

Casperjs中fill提交表单遇到的问题

1.if you access internet with proxy please add --ignore-ssl-errorstrue --ssl-protocolany 2.casper.then* and casper.wait* 都是异步执行的 他们的调用&#xff0c;都是按堆栈中的顺序来执行&#xff1b;也就是说&#xff0c;其他同步执行的函数&#xff0c;…

Xuggler视频处理简介

注意&#xff1a;这是我们的“ Xuggler开发教程 ”系列的一部分。 随着互联网上视频的爆炸式增长&#xff0c;开发人员经常需要在其应用程序中操纵视频内容。 Xuggler是Java开发人员的免费开放源代码库&#xff0c;可用于实时解压缩&#xff0c;处理和压缩录制的视频或实时视频…

软件测试中条件覆盖,路径覆盖,语句覆盖,分支覆盖的区别

转&#xff1a;软件测试中条件覆盖&#xff0c;路径覆盖&#xff0c;语句覆盖&#xff0c;分支覆盖的区别 举个例子吧 if A and B then Action1 if C or D then Action2 语句覆盖最弱&#xff0c;只需要让程序中的语句都执行一遍即可 …

Spring_讲解

http://s&#xff0c;i&#xff0c;s&#xff0c;h&#xff0c;u&#xff0c;o&#xff0c;k.com/forum/blogPost/list/6174.html转载于:https://www.cnblogs.com/gisblogs/p/4579162.html

使用Spring AspectJ和Maven进行面向方面的编程

Spring框架附带AOP支持。 实际上&#xff0c;如Spring参考文档中所述 &#xff0c; “ Spring的关键组件之一是AOP框架。 尽管Spring IoC容器不依赖于AOP&#xff0c;这意味着您不需要使用AOP&#xff0c;但AOP是对Spring IoC的补充&#xff0c;以提供功能强大的中间件解决方案…

hadoop5--mapreduce设计模式

运行结果附图 本节课程主要内容为学习MapReduc设计模式&#xff0c;并编写java程序对日志文件进行处理。 课本上介绍的MapReduce的设计模式主要包含:计数(Counting),分类(Classification),过滤处理(Filtering),排序(Sorting),去重计数(Distinct Counting),相关计数(Cross-Corre…

ES5中新增的Array方法详细说明

http://www.zhangxinxu.com/wordpress/2013/04/es5%E6%96%B0%E5%A2%9E%E6%95%B0%E7%BB%84%E6%96%B9%E6%B3%95/转载于:https://www.cnblogs.com/lmw425317/p/5339539.html

jqGrid,REST,AJAX和Spring MVC集成

两年多以前&#xff0c;我写了一篇关于两个如何在Struts2中实现优雅的CRUD的文章。 实际上&#xff0c;我必须就该主题写两篇文章&#xff0c;因为该主题如此广泛。 今天&#xff0c;我采用了一套更为流行的&#xff0c;完善的框架和库&#xff0c;采用了更为轻量级的现代方法。…

Java-马士兵设计模式学习笔记-代理模式--动态代理 修改成可以代理任意接口

一、概述 1.目标&#xff1a;把Proxy修改成可以代理任意接口及其任意方法 2.思路&#xff1a; (1)代理任意接口&#xff1a;把接口类型作为参数传给Proxy的newProxyInstance(Class interfze) (2)代理任意方法&#xff1a;用interfze.getMethods()取出所有方法&#xff0c;拼接实…

PTA习题

PTA习题 PTA浙大版《C语言程序设计&#xff08;第3版&#xff09;》 题目集5-6 水仙花数是指一个N位正整数&#xff08;N≥3&#xff09;&#xff0c;它的每个位上的数字的N次幂之和等于它本身。 本题要求编写两个函数&#xff0c;一个判断给定整数是否水仙花数&#xff0c;…

acdream 1409 Musical 状压DP

链接&#xff1a;http://acdream.info/problem?pid1409 题意&#xff1a;整个国家有n座城市&#xff0c;每座城市有三种粉丝。 第一种一周看一场音乐剧&#xff0c;挑选的音乐剧是已经在周围城市播放上演过的次数最多的音乐剧中的随机一个。 另外一种每天看一场音乐剧&#xf…

真正的模块化Web应用程序:为什么没有开发标准?

OSGI &#xff0c; SpringSource &#xff0c; Jboss模块 &#xff0c;J2EE和清单永远不会结束。所有这些技术都向他们的最终用户/开发人员保证了相同的东西&#xff0c;或多或少是Java模块化Web应用程序&#xff08;&#xff1f;&#xff09;。 但是&#xff0c;我们当中有多少…

C语言5-7习题

本题要求实现一个函数&#xff0c;用下列公式求cos(x)的近似值&#xff0c;精确到最后一项的绝对值小于e&#xff1a; #include <stdio.h> #include <math.h>double funcos( double e, double x );int main() { double e, x;scanf("%lf %lf", &…

JDBC批处理executeBatch

JDBC运行SQL声明&#xff0c;有两个处理接口&#xff0c;一PreparedStatement,Statement,一般程序JDBC有多少仍然比较PreparedStatement 只要运行批处理&#xff0c;PreparedStatement少一点Statement ps conn.prepareStatement(sql); for(int i 0;i<10;i){ ps.setString(…

BC div2补题以及 复习模除 逆元__BestCoder Round #78 (div.2)

第一题没话说 智商欠费 加老柴辅导终于过了 需要在意的是数据范围为2的63次方-1 三个数相加肯定爆了 四边形的定义  任意边小于其余三边之和 换句话说就是  最长边小于其余三边之和 这样的话问题转化为 最长边依次减其余三边的结果是否小于等于0 还有一点是题目出现0边 即最…

习题6-1 分类统计字符个数 (15 分)

本题要求实现一个函数&#xff0c;统计给定字符串中英文字母、空格或回车、数字字符和其他字符的个数。 函数接口定义&#xff1a; void StringCount( char s[] );其中 char s[] 是用户传入的字符串。函数StringCount须在一行内按照 letter 英文字母个数, blank 空格或回车…

Servlet 3.0异步处理可将服务器吞吐量提高十倍

Servlet是Java中处理服务器端逻辑的主要组件&#xff0c;新的3.0规范引入了一些非常有趣的功能&#xff0c;其中异步处理是最重要的功能之一。 可以利用异步处理来开发高度可伸缩的Web应用程序。 使用此功能可以有效地构建Web 2.0站点和AJAX应用程序。 我们的JCG合作伙伴之一To…