做短,但做對!

編寫簡潔,優雅,清晰的代碼一直是開發人員的艱巨任務。 您的同事不僅會感謝您,而且您會驚訝地發現,不斷期待著重構解決方案以更少的代碼完成更多(或至少相同)的工作是多么令人興奮。 曾經有人說好的程序員是懶惰的程序員。 是的,是的。。。但是,真正優秀的程序員正在為它增添美感 。

在我關于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.pswp.cn/news/374944.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374944.shtml
英文地址,請注明出處:http://en.pswp.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…