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

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

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

自檢:

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

存在的問題:

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

編程規(guī)則:

變量要一次性完成初始化

應(yīng)對(duì)策略:

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

1. 變量的初始化

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

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

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

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

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)的代碼中,我們提取出了一個(gè)函數(shù),將 response 轉(zhuǎn)成對(duì)應(yīng)的內(nèi)部的 EPUB 狀態(tài)。

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

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

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

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

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ì)上是一回事,都是從一個(gè)變量的聲明到初始化成一個(gè)可用的狀態(tài),中間隔了太遠(yuǎn)的距離。

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

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

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

針對(duì)Map同樣有類似的用法:

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

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

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

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

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

相關(guān)文章

  • Maven+oracle+SSM搭建簡(jiǎn)單項(xiàng)目的方法

    Maven+oracle+SSM搭建簡(jiǎn)單項(xiàng)目的方法

    本篇文章主要介紹了Maven+oracle+SSM搭建簡(jiǎn)單項(xiàng)目的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-03-03
  • Spring純注解配置實(shí)現(xiàn)代碼示例解析

    Spring純注解配置實(shí)現(xiàn)代碼示例解析

    這篇文章主要介紹了Spring純注解配置實(shí)現(xiàn)代碼示例解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • IntelliJ IDEA配置Tomcat(完整版圖文教程)

    IntelliJ IDEA配置Tomcat(完整版圖文教程)

    這篇文章主要介紹了IntelliJ IDEA配置Tomcat(完整版圖文教程),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-05-05
  • 深入理解Java顯式鎖的相關(guān)知識(shí)

    深入理解Java顯式鎖的相關(guān)知識(shí)

    今天帶大家學(xué)習(xí)的是關(guān)于Java的相關(guān)知識(shí),文章圍繞著Java顯式鎖展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • java Unicode和UTF-8之間轉(zhuǎn)換實(shí)例

    java Unicode和UTF-8之間轉(zhuǎn)換實(shí)例

    這篇文章主要介紹了java Unicode和UTF-8之間轉(zhuǎn)換實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • java中使用Files.readLines()處理文本中行數(shù)據(jù)方式

    java中使用Files.readLines()處理文本中行數(shù)據(jù)方式

    這篇文章主要介紹了java中使用Files.readLines()處理文本中行數(shù)據(jù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Map獲取鍵值,Map的幾種遍歷方法總結(jié)(推薦)

    Map獲取鍵值,Map的幾種遍歷方法總結(jié)(推薦)

    下面小編就為大家?guī)硪黄狹ap獲取鍵值,Map的幾種遍歷方法總結(jié)(推薦)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-04-04
  • SpringMVC @ResponseBody 415錯(cuò)誤處理方式

    SpringMVC @ResponseBody 415錯(cuò)誤處理方式

    這篇文章主要介紹了SpringMVC @ResponseBody 415錯(cuò)誤處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • java使用poi生成excel的步驟

    java使用poi生成excel的步驟

    2010以上格式使用XSSFWorkBook對(duì)象, 2003格式使用HSSFWorkBook對(duì)象, 其他對(duì)象操作基本一樣,本文重點(diǎn)給大家介紹java使用poi生成excel的相關(guān)知識(shí),感興趣的朋友一起看看吧
    2022-04-04
  • SpringSecurity授權(quán)實(shí)現(xiàn)基本思路

    SpringSecurity授權(quán)實(shí)現(xiàn)基本思路

    本文介紹了SpringSecurity中使用FilterSecurityInterceptor進(jìn)行權(quán)限校驗(yàn)的基本方法,通過SecurityContextHolder獲取Authentication中的權(quán)限信息,感興趣的朋友跟隨小編一起看看吧
    2024-10-10

最新評(píng)論

叙永县| 成都市| 壤塘县| 定远县| 石泉县| 海丰县| 军事| 安图县| 德保县| 江城| 库伦旗| 太仓市| 长汀县| 铜梁县| 略阳县| 包头市| 阿拉善左旗| 沁源县| 鄂伦春自治旗| 通城县| 东阿县| 晋江市| 汝阳县| 平舆县| 金门县| 林西县| 吴旗县| 翁源县| 靖江市| 宁晋县| 南涧| 那坡县| 广德县| 宣化县| 丽江市| 西华县| 体育| 黄石市| SHOW| 新蔡县| 鹿泉市|