1. 好用:強(qiáng)大的 IDEA 代碼生成器

        共 3061字,需瀏覽 7分鐘

         ·

        2020-10-31 20:38

        程序員的成長(zhǎng)之路
        互聯(lián)網(wǎng)/程序員/技術(shù)/資料共享?
        關(guān)注


        閱讀本文大概需要 4 分鐘。

        來自:架構(gòu)師之路

        前言
        Java 開發(fā)過程經(jīng)常需要編寫有固定格式的代碼,例如說聲明一個(gè)私有變量,logger或者bean等等。對(duì)于這種小范圍的代碼生成,我們可以利用 IDEA 提供的 Live Templates功能。
        剛開始覺得它只是一個(gè)簡(jiǎn)單的Code Snippet,后來發(fā)現(xiàn)它支持變量函數(shù)配置,可以支持很復(fù)雜的代碼生成。下面我來介紹一下Live Templates的用法。

        基本使用

        IDEA 自帶很多常用的動(dòng)態(tài)模板,在 Java 代碼中輸入fori,回車就會(huì)出現(xiàn)
        for (int i = 0; i < ; i++) {

        }
        按Tab可以在各個(gè)空白處跳轉(zhuǎn),手動(dòng)填值。
        自定義 Template
        官方自帶模板畢竟不能滿足我們個(gè)人編碼風(fēng)格的需要,Live Templates提供了變量函數(shù)的方式供我們自定義。
        簡(jiǎn)單用法
        新增自定義模板,首先需要填寫觸發(fā)單詞(即 Abbreviation),描述是可選的,然后定義模板的上下文,點(diǎn)擊define選擇Java,這樣在編輯 Java 的時(shí)候就會(huì)觸發(fā)當(dāng)前模板,定義完上下文之后,就可以填寫模板了。
        下面列舉幾個(gè)我常用的簡(jiǎn)單模板
        ==========

        ----------
        System.out.println($END$)
        ==========

        ----------
        privatefinalstatic String $varName$ = "$var$";`
        ==========

        ----------
        /**
        * $COMMENT$
        */

        @Getter
        @Setter
        private $TYPE$ $NAME$;
        ==========

        ----------
        public static void main(String[] args) {
        $END$
        }
        ==========
        模板支持變量的定義,使用$$包圍的字符表示一個(gè)變量。是一個(gè)特殊的預(yù)定義變量,表示光標(biāo)最后跳轉(zhuǎn)的位置。每個(gè)變量的位置都可以跳轉(zhuǎn)過去。
        高級(jí)用法
        如果你用過 vim 的Code Sinppet插件,你會(huì)發(fā)現(xiàn)模板里面是可以執(zhí)行函數(shù)的,強(qiáng)大的 Live Templates當(dāng)然也支持,而且 IDEA 能夠感知代碼的語義,例如說當(dāng)前編輯的函數(shù)的參數(shù)。但這一點(diǎn)就能夠讓我們玩出花來。我們從易到難來研究模板函數(shù)的功能。
        前面我們提到的變量可以綁定函數(shù),配置方式如上圖所示。

        快速聲明變量

        聲明變量是一個(gè)常用的操作,特別是需要聲明變量需要加注解,注釋的時(shí)候,這些代碼寫起來就很枯燥。下面是我定義的模板:

        ----------
        /**
        * $END$
        */

        @OsgiReference
        @Setter
        private $TYPE$ $NAME$;
        乍一看這個(gè)模板跟我上面定義的privateField差不多,唯一的不同在于我給這些變量綁定了函數(shù)。
        1.clipboard():返回當(dāng)前粘貼板的字符串
        2.decapitalize():將輸入的字符串首字母變?yōu)樾?/span>
        下面我們演示一下,我們先拷貝當(dāng)前類名,然后輸入osgiRef

        快速聲明 logger

        聲明 logger 也是一個(gè)常用的操作,上面我們是利用了粘貼函數(shù)來快速聲明變量,現(xiàn)在我們來利用另一個(gè)函數(shù)className(),顧名思義,它的作用就是返回當(dāng)前類名。

        ----------
        /** logger */
        privatestaticfinal Logger LOGGER = LoggerFactory.getLogger($CLASS$.class);

        最強(qiáng)大的 groovyScript()

        如果說上面用到的函數(shù)提供的能力有限,不夠靈活,那么groovyScript()提供了一切你想要的能力,它支持執(zhí)行 Groovy 腳本處理輸入,然后輸出處理后的字符串。
        groovyScript("code", ...)

        | code | 一段Groovy代碼或者Groovy腳本代碼絕對(duì)路徑 |
        | ... | 可選入?yún)?,這些參數(shù)會(huì)綁定到`_1, _2, _3, ..._n`, 在 Groovy 代碼中使用。|
        下面我們來看一下它的實(shí)際應(yīng)用。
        快速 bean 配置
        新增一個(gè)服務(wù)都要在 Spring 中注冊(cè)一個(gè) bean,一般這個(gè)配置無非就是將指明id和class,由于我們是在 xml 中配置,所以不能利用className()函數(shù),但是我們可以利用clipboard()函數(shù)獲取到類的全引用,在 IDEA 中我們直接右鍵類名,點(diǎn)擊Copy Reference就行。然后執(zhí)行 groovy 腳本獲取類名。

        ----------
        "$id$"
        class="$REF$" />
        id綁定decapitalize(groovyScript("_1.tokenize('.')[-1]", clipboard())),首先取clipboard()的值得到類的全引用,然后執(zhí)行 groovy 代碼_1.tokenize('.')[-1](按.分割為字符串?dāng)?shù)組,然后取最后一個(gè)即可得到類名,然后用decapitalize()將首字母小寫即可得到id。
        快速打印當(dāng)前上下文信息
        打印錯(cuò)誤日志的時(shí)候需要打印當(dāng)前上下文信息的,例如說入?yún)?,有時(shí)候入?yún)⒑芏嗟臅r(shí)候,寫起來很痛苦,好在有模板函數(shù)methodParameters(),返回當(dāng)前函數(shù)參數(shù)的列表,當(dāng)然這個(gè)列表我們不能直接使用,需要結(jié)合groovyScript對(duì)它進(jìn)行轉(zhuǎn)化。

        ---------------
        LogUtil.$TYPE$(LOGGER, "$MSG$ " + $params$);
        將params綁定到groovyScript("'"' + _1.collect { it + ' = [" + ' + it + ' + "]'}.join(', ') + '"'", methodParameters()),就能夠自動(dòng)將當(dāng)前函數(shù)的參數(shù)格式化后輸出。

        總結(jié)
        上面我們簡(jiǎn)單介紹了常用的模板函數(shù),其實(shí) IDEA 還有很多其它模板函數(shù),具體參考Creating and Editing Template Variables(https://www.jetbrains.com/help/idea/2016.3/creating-and-editing-template-variables.html)。
        IDEA 是一個(gè)很強(qiáng)大的工具,善用工具能夠極大的提高工作效率,將精力投入到關(guān)鍵的事情上,而不是將時(shí)間浪費(fèi)在編寫重復(fù)代碼上面。一些更高級(jí)的用法還有待大家去發(fā)掘。最后推廣一波代碼生成插件CodeMaker(https://github.com/x-hansong/CodeMaker),好好利用也能節(jié)省很多重復(fù)編寫代碼的時(shí)間。

        別忘記點(diǎn)個(gè)在看,咱們下篇見!

        每天進(jìn)步一點(diǎn)點(diǎn)
        慢一點(diǎn)才能更快
        推薦閱讀:

        SpringBoot + MyBatis + MySQL讀寫分離實(shí)踐!

        再說一次,MongoDB不是“萬能藥”,請(qǐng)別亂用!

        5T技術(shù)資源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,單片機(jī),樹莓派,等等。在公眾號(hào)內(nèi)回復(fù)「2048」,即可免費(fèi)獲取?。?/span>

        微信掃描二維碼,關(guān)注我的公眾號(hào)

        朕已閱?

        瀏覽 96
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
          
          

            1. 一级无码高清 | 大鸡巴干逼视频 | acca少女sdanvi的最新消息 | 日本少妇的性生活 | aaa精品|