最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java開發(fā)時(shí)各類工具的使用規(guī)范

 更新時(shí)間:2020年07月15日 11:54:55   作者:javaeelwh  
這篇文章主要介紹了java編碼時(shí)各類工具的使用規(guī)范,多人協(xié)作、共同開發(fā)一個(gè)項(xiàng)目,如果沒(méi)有統(tǒng)一的代碼規(guī)范的話,項(xiàng)目中的每個(gè)人都按照自己的習(xí)慣率性而為,就會(huì)導(dǎo)致整個(gè)項(xiàng)目的代碼看上去雜亂無(wú)章,可讀性非常差,并且持續(xù)增加后續(xù)的維護(hù)成本。對(duì)此感興趣可以來(lái)了解一下

工具類規(guī)范

一個(gè)項(xiàng)目不可能沒(méi)有工具類,工具類的初衷是良好的,代碼重用,但到了后面工具類越來(lái)越亂,有些項(xiàng)目工具類有幾十個(gè),看的眼花繚亂,還有不少重復(fù)。如何編寫出好的工具類,我有幾點(diǎn)建議:

隱藏實(shí)現(xiàn)

就是要定義自己的工具類,盡量不要在業(yè)務(wù)代碼里面直接調(diào)用第三方的工具類。這也是解耦的一種體現(xiàn)。如果我們不定義自己的工具類而是直接使用第三方的工具類有2個(gè)不好的地方:

  1. 不同的人會(huì)使用不同的第三方工具庫(kù),會(huì)比較亂。
  2. 將來(lái)萬(wàn)一要修改工具類的實(shí)現(xiàn)邏輯會(huì)很痛苦。

以最簡(jiǎn)單的字符串判空為例,很多工具庫(kù)都有 StringUtils工具類,如果我們使用commons的工具類,一開始我們直接使用StringUtils.isEmpty,字符串為空或者空串的時(shí)候會(huì)返回為true,后面業(yè)務(wù)改動(dòng),需要改成如果全部是空格的時(shí)候也會(huì)返回true,怎么辦?我們可以改成使用StringUtils.isBlank。看上去很簡(jiǎn)單,對(duì)吧? 如果你有幾十個(gè)文件都調(diào)用了,那我們要改幾十個(gè)文件,是不是有點(diǎn)惡心?再后面發(fā)現(xiàn),不只是英文空格,如果是全角的空格,也要返回為true,怎么辦?StringUtils上的方法已經(jīng)不能滿足我們的需求了,真不好改了。。。

所以我的建議是,一開始就自己定義一個(gè)自己項(xiàng)目的StringUtil,里面如果不想自己寫實(shí)現(xiàn),可以直接調(diào)用commons的方法,如下:

public static boolean isEmpty(String str) {
 return org.apache.commons.lang3.StringUtils.isEmpty(str);
}

后面全部空格也返回true的時(shí)候,我們只需要把isEmpty改成isBlank;再后面全部全角空格的時(shí)候也返回true的話,我們?cè)黾幼约旱倪壿嫾纯伞N覀冎恍枰膭?dòng)和測(cè)試一個(gè)地方。

在舉一個(gè)真實(shí)一點(diǎn)的例子,如復(fù)制對(duì)象的屬性方法。

一開始,如果我們自己不定義工具類方法,那么我們可以使用org.springframework.beans.BeanUtils.copyProperties(source, dest)這個(gè)工具類來(lái)實(shí)現(xiàn),就一行代碼,和調(diào)用自己的工具類沒(méi)有什么區(qū)別。看上去很OK,對(duì)吧?

隨著業(yè)務(wù)發(fā)展,我們發(fā)現(xiàn)這個(gè)方式的性能或者某些特性不符合我們要求,我們需要修改改成commons-beanutils包里面的方法,org.apache.commons.beanutils.BeanUtils.copyProperties(dest, source),這個(gè)時(shí)候問(wèn)題來(lái)了,第一個(gè)問(wèn)題,它的方法的參數(shù)順序和之前spring的工具類是相反的,改起來(lái)非常容易出錯(cuò)!第二個(gè)問(wèn)題,這個(gè)方法有異常拋出,必須聲明,這個(gè)改起來(lái)可要命了!結(jié)果你發(fā)現(xiàn),一個(gè)看上去很小的改動(dòng),改了幾十個(gè)文件,每個(gè)改動(dòng)還得測(cè)試一次,風(fēng)險(xiǎn)不是那么得小。有一點(diǎn)小奔潰了,是不是?

等你改完之后測(cè)試完了,突然有一天需要改成,復(fù)制參數(shù)的時(shí)候,有些特殊字段需要保留(如對(duì)象id)或者需要過(guò)濾掉(如密碼)不復(fù)制,怎么辦?這個(gè)時(shí)候我估計(jì)你要崩潰了吧?不要覺(jué)得我是憑空想象,編程活久見(jiàn),你總會(huì)遇到的一天!

所以,我們需要定義自己的工具類函數(shù),一開始我定義成這樣子。

public void copyAttribute(Object source, Object dest) {

 org.springframework.beans.BeanUtils.copyProperties(source, dest);

}

后面需要修改為commons-beanutis的時(shí)候,我們改成這樣即可,把參數(shù)順序掉過(guò)來(lái),然后處理了一下異常,我使用的是Lombok的SneakyThrows來(lái)處理異常,你也可以捕獲掉拋出運(yùn)行時(shí)異常,個(gè)人喜好。

@SneakyThrows
public void copyAttribute(Object source, Object dest) {
 org.apache.commons.beanutils.BeanUtils.copyProperties(dest, source);
}

再后面,復(fù)制屬性的時(shí)候需要保留某些字段或者過(guò)濾掉某些字段,我們自己參考其他庫(kù)實(shí)現(xiàn)一次即可,只改動(dòng)價(jià)格和測(cè)試一個(gè)文件一個(gè)方法,風(fēng)險(xiǎn)非常可控。

還記得我之前的帖子里說(shuō)的需求變更嗎?你可以認(rèn)為這算需求變更,但同樣的需求變更,我一個(gè)小時(shí)改完測(cè)試,沒(méi)有任何風(fēng)險(xiǎn)輕輕松松上線,你可能滿頭大汗加班加點(diǎn)還擔(dān)心出問(wèn)題。。。

使用父類/接口

上面那點(diǎn)隱藏實(shí)現(xiàn),說(shuō)到底是封裝/解耦的思想,而現(xiàn)在說(shuō)的這點(diǎn)是抽象的思想,做好了這點(diǎn),我們就能編寫出看上去很專業(yè)的工具類。這點(diǎn)很好理解,但是我們?nèi)菀缀雎浴?/p>

舉例,假設(shè)我們寫了一個(gè)判斷arraylist是否為空的函數(shù),一開始是這樣的。

public static boolean isEmpty(ArrayList<?> list) {
 return list == null || list.size() == 0;
}

這個(gè)時(shí)候,我們需要思考一下參數(shù)的類型能不能使用父類。我們看到我們只用了size方法,我們可以知道size方法再list接口上有,于是我們修改成這樣。

public static boolean isEmpty(List<?> list) {
 return list == null || list.size() == 0;
}

后面發(fā)現(xiàn),size方法再list的父類/接口Collection上也有,那么我們可以修改為最終這樣。

public static boolean isEmpty(Collection<?> list) {
 return list == null || list.size() == 0;
}

到了這部,Collection沒(méi)有父類/接口有size方法了,修改就結(jié)束了。最后我們需要把參數(shù)名字改一下,不要再使用list。改完后,所有實(shí)現(xiàn)了Collection都對(duì)象都可以用,最終版本如下:

public static boolean isEmpty(Collection<?> collection) {
 return collection == null || collection.size() == 0;
}

是不是看上去通用多了 ,看上去也專業(yè)多了?上面的string相關(guān)的工具類方法,使用相同的思路,我們最終修改一下,把參數(shù)類類型由String修改為CharSequence,參數(shù)名str修改為cs。如下:

public static boolean isEmpty(CharSequence cs) {
 return org.apache.commons.lang3.StringUtils.isEmpty(cs);
}

思路和方法很簡(jiǎn)單,但效果很好,寫出來(lái)的工具類也顯得很專業(yè)!總結(jié)一下,思路是抽象的思想,主要是修改參數(shù)類型,方法就是往上找父類/接口,一直找到頂為止,記得修改參數(shù)名。

使用重載編寫衍生函數(shù)組

開發(fā)過(guò)的兄弟都知道,有一些工具庫(kù),有一堆的重載函數(shù),調(diào)用起來(lái)非常方便,經(jīng)常能直接調(diào)用,不需要做參數(shù)轉(zhuǎn)換。這些是怎么樣編寫出來(lái)的呢?我們舉例說(shuō)明。

現(xiàn)在需要編寫一個(gè)方法,輸入是一個(gè)utf-8格式的文件的文件名,把里面內(nèi)容輸出到一個(gè)list。我們剛剛開始編寫的時(shí)候,是這個(gè)樣子的

public static List<String> readFile2List(String filename) throws IOException {
 List<String> list = new ArrayList<String>();

 File file = new File(filename);

 FileInputStream fileInputStream = new FileInputStream(file);

 BufferedReader br = new BufferedReader(new InputStreamReader(fileInputStream, 
 "UTF-8"));

 // XXX操作

 return list;
}

我們先實(shí)現(xiàn),實(shí)現(xiàn)完之后我們做第一個(gè)修改,很明顯,utf-8格式是很可能要改的,所以我們先把它做為參數(shù)提取出去,方法一拆為二,就變成這樣。

public static List<String> readFile2List(String filename) throws IOException {
 return readFile2List(filename, "UTF-8");
}

public static List<String> readFile2List(String filename, String charset) 
 throws IOException {
 List<String> list = new ArrayList<String>();

 File file = new File(filename);
 FileInputStream fileInputStream = new FileInputStream(file);

 BufferedReader br = new BufferedReader(new InputStreamReader(fileInputStream,
 charset));

 // XXX操作

 return list;
}

多了一個(gè)方法,直接調(diào)用之前的方法主體,主要的代碼還是只有一份,之前的調(diào)用地方不需要做任何修改!可以放心修改。

然后我們?cè)诳蠢锩娴膶?shí)現(xiàn),下面這2行代碼里面,String類型的filename會(huì)變化為File類型,然后在變化為FileInputStream 類型之后才使用。

File file = new File(filename);
FileInputStream fileInputStream = new FileInputStream(file);

這里我們就應(yīng)該想到,用戶可能直接傳如File類型,也可能直接傳入FileInputStream類型,我們應(yīng)該都需要支持,而不需要用戶自己做類型的處理!在結(jié)合上一點(diǎn)的使用父類,把FileInputStream改成父類InputStream,我們最終的方法組如下:

package plm.common.utils;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.io.IOUtils;

/**
 * 工具類編寫范例,使用重載編寫不同參數(shù)類型的函數(shù)組
 * 
 * @author 曉風(fēng)輕 https://github.com/xwjie/PLMCodeTemplate
 *
 */
public class FileUtil {

 private static final String DEFAULT_CHARSET = "UTF-8";

 public static List<String> readFile2List(String filename) throws IOException {
 return readFile2List(filename, DEFAULT_CHARSET);
 }

 public static List<String> readFile2List(String filename, String charset)
 throws IOException {
 FileInputStream fileInputStream = new FileInputStream(filename);
 return readFile2List(fileInputStream, charset);
 }

 public static List<String> readFile2List(File file) throws IOException {
 return readFile2List(file, DEFAULT_CHARSET);
 }

 public static List<String> readFile2List(File file, String charset)
 throws IOException {
 FileInputStream fileInputStream = new FileInputStream(file);
 return readFile2List(fileInputStream, charset);
 }

 public static List<String> readFile2List(InputStream fileInputStream)
 throws IOException {
 return readFile2List(fileInputStream, DEFAULT_CHARSET);
 }

 public static List<String> readFile2List(InputStream inputStream, String charset)
 throws IOException {
 List<String> list = new ArrayList<String>();

 BufferedReader br = null;
 try {
 br = new BufferedReader(new InputStreamReader(inputStream, charset));

 String s = null;
 while ((s = br.readLine()) != null) {
 list.add(s);
 }
 } finally {
 IOUtils.closeQuietly(br);
 }

 return list;
 }

}

怎么樣?6個(gè)方法,實(shí)際上代碼主體只有一份,但提供各種類型的入?yún)?,調(diào)用起來(lái)很方便。開發(fā)組長(zhǎng)編寫的時(shí)候,多費(fèi)一點(diǎn)點(diǎn)時(shí)間,就能寫來(lái)看上去很專業(yè)調(diào)用起來(lái)很方便的代碼。如果開發(fā)組長(zhǎng)不寫好,開發(fā)人員發(fā)現(xiàn)現(xiàn)有的方法只能傳String,她要傳的是InputStream,她又不敢改原來(lái)的代碼,就會(huì)copy一份然后修改一下,就多了一份重復(fù)代碼。代碼就是這樣爛下去了。。。

關(guān)鍵點(diǎn),多想一步,根據(jù)參數(shù)變化編寫各種類型的入?yún)⒑瘮?shù),需要保證函數(shù)主要代碼只有一份。

使用靜態(tài)引入

工具類的一個(gè)問(wèn)題就是容易泛濫,主要原因是開發(fā)人員找不到自己要用的方法,就自己寫一個(gè),開發(fā)人員很難記住類名,你也不可能天天代碼評(píng)審。

所以要讓開發(fā)人員容易找到,我們可以使用靜態(tài)引入,在Eclipse里面這樣導(dǎo)入:

物理上獨(dú)立存放

這點(diǎn)是我的習(xí)慣,我習(xí)慣把和業(yè)務(wù)無(wú)關(guān)的代碼放到獨(dú)立的工程或者目錄,在物理上要分開,專人維護(hù)。不是所有人都有能力寫工具類,獨(dú)立存放專門維護(hù),專門的權(quán)限控制有助于保證代碼的純潔和質(zhì)量。這樣普通的開發(fā)人員就不會(huì)隨意修改。

例如我的范例工程里面,專門建立了一個(gè)source目錄存放框架代碼,工具類也在里面,這里的代碼,只有我一個(gè)人會(huì)去修改:

總結(jié)

幾乎所有人都知道面向?qū)ο蟮乃枷胗谐橄蠓庋b,但幾個(gè)人真正能做到,其實(shí)有心的話,處處都能體現(xiàn)出這些思想。編寫工具類的時(shí)候需要注意參數(shù)的優(yōu)化,而且大型項(xiàng)目里面不要在業(yè)務(wù)代碼里面直接調(diào)用第三方的工具類,然后就是多想一步多走一步,考慮各種類型的入?yún)ⅲ@樣你也能編寫出專業(yè)靈活的工具類!

到此這篇關(guān)于java開發(fā)時(shí)各類工具的使用規(guī)范的文章就介紹到這了,更多相關(guān)java編碼時(shí)工具的使用規(guī)范內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • springboot?sleuth?日志跟蹤問(wèn)題記錄

    springboot?sleuth?日志跟蹤問(wèn)題記錄

    Spring?Cloud?Sleuth是一個(gè)在應(yīng)用中實(shí)現(xiàn)日志跟蹤的強(qiáng)有力的工具,使用Sleuth庫(kù)可以應(yīng)用于計(jì)劃任務(wù)?、多線程服務(wù)或復(fù)雜的Web請(qǐng)求,尤其是在一個(gè)由多個(gè)服務(wù)組成的系統(tǒng)中,這篇文章主要介紹了springboot?sleuth?日志跟蹤,需要的朋友可以參考下
    2023-07-07
  • java?class?name實(shí)例深入精講

    java?class?name實(shí)例深入精講

    這篇文章主要為大家介紹了java?class?name實(shí)例深入精講,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • Spring boot配置文件加解密詳解

    Spring boot配置文件加解密詳解

    這篇文章主要給大家介紹了關(guān)于Spring boot配置文件加解密的相關(guān)資料,文中通過(guò)示例代碼以及圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Java?中向?Arraylist?添加對(duì)象的示例代碼

    Java?中向?Arraylist?添加對(duì)象的示例代碼

    本文介紹了如何在 Java 中向 ArrayList 添加對(duì)象,并提供了示例和注意事項(xiàng),通過(guò)掌握這些知識(shí),讀者可以在自己的 Java 項(xiàng)目中有效地使用 ArrayList 來(lái)存儲(chǔ)和操作對(duì)象,需要的朋友可以參考下
    2023-11-11
  • MyBatis_Generator插件的安裝以及簡(jiǎn)單使用方法(圖解)

    MyBatis_Generator插件的安裝以及簡(jiǎn)單使用方法(圖解)

    下面小編就為大家?guī)?lái)一篇MyBatis_Generator插件的安裝以及簡(jiǎn)單使用方法(圖解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-05-05
  • java編碼IDEA主題推薦

    java編碼IDEA主題推薦

    在這篇文章中,我精選了幾個(gè)比較是和?Java?編碼的?IDEA?主題供小伙伴們選擇。另外,我自己用的是?One?Dark?theme?這款,有需要的朋友可以借鑒參考下,希望大家喜歡
    2022-01-01
  • Java基于二維數(shù)組實(shí)現(xiàn)的數(shù)獨(dú)問(wèn)題示例

    Java基于二維數(shù)組實(shí)現(xiàn)的數(shù)獨(dú)問(wèn)題示例

    這篇文章主要介紹了Java基于二維數(shù)組實(shí)現(xiàn)的數(shù)獨(dú)問(wèn)題,涉及java針對(duì)數(shù)組的遍歷、計(jì)算、轉(zhuǎn)換等相關(guān)操作技巧,需要的朋友可以參考下
    2018-01-01
  • java高并發(fā)ScheduledThreadPoolExecutor類深度解析

    java高并發(fā)ScheduledThreadPoolExecutor類深度解析

    這篇文章主要為大家介紹了java高并發(fā)ScheduledThreadPoolExecutor類源碼深度解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • idea項(xiàng)目實(shí)現(xiàn)移除和添加git

    idea項(xiàng)目實(shí)現(xiàn)移除和添加git

    本文指導(dǎo)讀者如何從官網(wǎng)下載并安裝Git,以及在IDEA中配置Git的詳細(xì)步驟,首先,用戶需訪問(wèn)Git官方網(wǎng)站下載適合自己操作系統(tǒng)的Git版本并完成安裝,接著,在IDEA中通過(guò)設(shè)置找到git.exe文件以配置Gi
    2024-10-10
  • 完美解決idea無(wú)法搜索下載插件的問(wèn)題

    完美解決idea無(wú)法搜索下載插件的問(wèn)題

    這篇文章主要介紹了完美解決idea無(wú)法搜索下載插件的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-09-09

最新評(píng)論

东城区| 丰县| 柳河县| 西宁市| 措美县| 台东市| 祁东县| 沐川县| 万年县| 巴彦县| 马公市| 马边| 阳曲县| 乐平市| 泾源县| 武安市| 澄迈县| 邻水| 克东县| 平罗县| 吉安市| 临泽县| 墨竹工卡县| 桂林市| 礼泉县| 冀州市| 九江市| 宽甸| 紫金县| 济宁市| 鹰潭市| 左贡县| 襄城县| 萨迦县| 墨脱县| 大竹县| 武山县| 宣武区| 丰台区| 武胜县| 巨野县|