欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java變量的聲明與賦值分離規(guī)范示例

 更新時間:2023年09月21日 14:46:02   作者:GuangHui  
這篇文章主要為大家介紹了java變量的聲明與賦值分離規(guī)范示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

自檢:

變量聲明之后是否有立即賦值,集合聲明之后是否有立即添加元素

存在的問題:

變量的聲明和賦值分離帶來的問題就是,把賦值的過程與業(yè)務(wù)處理混雜在一起。

編程規(guī)則:

變量要一次性完成初始化

應(yīng)對策略:

  • 1.在聲明前面加上final,用不變性的限制約束代碼。
  • 2.用聲明式的方式進(jìn)行集合的初始化。
    • 傳統(tǒng)的集合初始化方式是命令式的,而我們要做的就是用聲明式的方式進(jìn)行集合的初始化,讓初始化的過程一次性完成。再進(jìn)一步,以聲明式的標(biāo)準(zhǔn)來看代碼,會幫助我們發(fā)現(xiàn)許多的。

1. 變量的初始化

EpubStatus status = null;
CreateEpubResponse response = createEpub(request);
if (response.getCode() == 201) {
    status = EpubStatus.CREATED;
} else {
    status = EpubStatus.TO_CREATE;
}

上面的代碼,從語義上說,第一行的變量初始化其實是沒有用的,這是一次假的初始化。這段代碼里的變量賦值是在聲明很久之后才完成的,也就是說,變量初始化沒有一次性完成。

這種代碼真正的問題就是不清晰,變量初始化與業(yè)務(wù)處理混在在一起。通常來說,這種代碼后面緊接著就是一大堆更復(fù)雜的業(yè)務(wù)處理。很多代碼難讀,一個重要的原因就是把不同層面的代碼混在了一起。

這種代碼在實際的代碼庫中出現(xiàn)的頻率非常高,只不過,它會以各種變形的方式呈現(xiàn)出來。有的變量甚至是在相隔很遠(yuǎn)的地方才做了真正的賦值,完成了初始化,這中間已經(jīng)夾雜了很多的業(yè)務(wù)代碼在其中,進(jìn)一步增加了理解的復(fù)雜度。所以,我們編程時要有一個基本原則:變量一次性完成初始化。

final CreateEpubResponse response = createEpub(request);
final EpubStatus status = toEpubStatus(response);
private EpubStatus toEpubStatus(final CreateEpubResponse response) {
    if (response.getCode() == 201) {
        return EpubStatus.CREATED;
    }
    return EpubStatus.TO_CREATE;
}

在這段改進(jìn)的代碼中,我們提取出了一個函數(shù),將 response 轉(zhuǎn)成對應(yīng)的內(nèi)部的 EPUB 狀態(tài)。

還有一點不知道你注意到了沒有,在新的變量聲明中,我加上了 final,在 Java 的語義中,一個變量加上了 final,也就意味著這個變量不能再次賦值。盡可能編寫不變的代碼,盡可能使用不變的量。所以,在能夠使用 final 的地方盡量使用 final,限制變量的賦值。

對于 Java 程序員來說,還有一個特殊的場景,就是異常處理的場景,強迫你把變量的聲明與初始化分開,就像下面這段代碼:

InputStream is = null;
try {
    is = new FileInputStream(...);
    ...
} catch (IOException e) {
    ...
} finally {
    if (is != null) {
        is.close();
    }
}

如果采用 Java 7 之后的版本,采用 try-with-resource 的寫法,代碼就可以更簡潔了:

try (InputStream is = new FileInputStream(...)) {
    ...
}

2. 集合的初始化

List<Permission> permissions = new ArrayList<>();
permissions.add(Permission.BOOK_READ);
permissions.add(Permission.BOOK_WRITE);
check.grantTo(Role.AUTHOR, permissions);

這和我們前面所說的變量先聲明后賦值,本質(zhì)上是一回事,都是從一個變量的聲明到初始化成一個可用的狀態(tài),中間隔了太遠(yuǎn)的距離。

我們可以使用 Guava(Google 提供的一個 Java 庫)進(jìn)行修改優(yōu)化:

List<Permission> permissions = ImmutableList.of(
Permission.BOOK_READ,
Permission.BOOK_WRITE
);
check.grantTo(Role.AUTHOR, permissions);

這段代碼里的 List 用的是一個 ImmutableList,也就是一個不可變的 List,也就是說,這個 List 一旦創(chuàng)建好了,就是不能修改了,對應(yīng)的實現(xiàn)就是各種添加、刪除之類的方法全部都禁用了。

針對Map同樣有類似的用法:

private static Map<Locale, String> CODE_MAPPING = ImmutableMap.of(
LOCALE.ENGLISH, "EN",
LOCALE.CHINESE, "CH"
);

對比我們改造前后的代碼,二者之間還有一個更關(guān)鍵的區(qū)別:前面的代碼是命令式的代碼,而后面的代碼是聲明式的代碼。

命令式的代碼,就是告訴你“怎么做”的代碼,就像改造前的代碼,聲明一個集合,然后添加一個元素,再添加一個元素。而聲明式的代碼,是告訴你“做什么”的代碼,改造后就是,我要一個包含了這兩個元素的集合。

聲明式的代碼體現(xiàn)的意圖,是更高層面的抽象,把意圖和實現(xiàn)分開,從某種意義上來說,也是一種分離關(guān)注點。所以,用聲明式的標(biāo)準(zhǔn)來看代碼,是一個發(fā)現(xiàn)代碼的重要參考。

以上就是java變量的聲明與賦值分離規(guī)范示例的詳細(xì)內(nèi)容,更多關(guān)于java變量的聲明與賦值分離的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java集合-HashMap

    Java集合-HashMap

    這篇文章主要介紹了Java集合HashMap,也叫散列表,是一種非常重要的數(shù)據(jù)結(jié)構(gòu),應(yīng)用場景及其豐富,許多緩存技術(shù)(比如memcached)的核心其實就是在內(nèi)存中維護(hù)一張大的哈希表,下面來看看文章的具體內(nèi)容吧,需要的小伙伴也可參考一下
    2022-01-01
  • java實現(xiàn)發(fā)送短信驗證碼

    java實現(xiàn)發(fā)送短信驗證碼

    這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)發(fā)送短信驗證碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • Java中跨域問題解決的幾種方式舉例詳解

    Java中跨域問題解決的幾種方式舉例詳解

    這篇文章主要介紹了前后端分離項目中跨域問題的解決方法,包括設(shè)置響應(yīng)頭信息、使用iframe、WebSocket、HttpServletResponse添加頭信息以及通過配置類等多種方式,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-12-12
  • Spring框架 引入@Resource注解報空指針的解決

    Spring框架 引入@Resource注解報空指針的解決

    這篇文章主要介紹了Spring框架 引入@Resource注解報空指針的解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • 詳解Java8中Optional的常見用法

    詳解Java8中Optional的常見用法

    Opitonal是java8引入的一個新類,目的是為了解決空指針異常問題。本文將通過示例為大家詳細(xì)講講Optional的常見用法,需要的可以參考一下
    2022-09-09
  • java 中JXL操作Excel實例詳解

    java 中JXL操作Excel實例詳解

    這篇文章主要介紹了java 中JXL操作Excel實例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • Java對象以Hash結(jié)構(gòu)存入Redis詳解

    Java對象以Hash結(jié)構(gòu)存入Redis詳解

    這篇文章主要介紹了Java對象以Hash結(jié)構(gòu)存入Redis詳解,和Java中的對象非常相似,卻不能按照J(rèn)ava對象的結(jié)構(gòu)直接存儲進(jìn)Redis的hash中,因為Java對象中的field是可以嵌套的,而Redis的Hash結(jié)構(gòu)不支持嵌套結(jié)構(gòu),需要的朋友可以參考下
    2023-08-08
  • Java獲取文件的類型和擴展名的實現(xiàn)方法

    Java獲取文件的類型和擴展名的實現(xiàn)方法

    這篇文章主要介紹了Java獲取文件的類型和擴展名的實現(xiàn)方法的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • Java驗證碼圖片生成代碼

    Java驗證碼圖片生成代碼

    這篇文章主要為大家詳細(xì)介紹了Java驗證碼圖片生成代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • 淺談SpringBoot內(nèi)嵌Tomcat的實現(xiàn)原理解析

    淺談SpringBoot內(nèi)嵌Tomcat的實現(xiàn)原理解析

    這篇文章主要介紹了淺談SpringBoot內(nèi)嵌Tomcat的實現(xiàn)原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12

最新評論