Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 99视频在线免费,国产在线精品一区二区三区不卡,99视频这里有精品

          整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          這可能是史上最詳細的 IDEA 中使用 Debug

          這可能是史上最詳細的 IDEA 中使用 Debug 教程
          作者:bojiangzhou,
          來源:www.cnblogs.com/chiangchou/p/idea-debug.html
          

          ebug用來追蹤代碼的運行流程,通常在程序運行過程中出現異常,啟用Debug模式可以分析定位異常發生的位置,以及在運行過程中參數的變化。通常我們也可以啟用Debug模式來跟蹤代碼的運行流程去學習三方框架的源碼。

          所以學習下如何在Intellij IDEA中使用好Debug。

          一、Debug開篇

          首先看下IDEA中Debug模式下的界面。

          如下是在IDEA中啟動Debug模式,進入斷點后的界面,我這里是Windows,可能和Mac的圖標等會有些不一樣。就簡單說下圖中標注的8個地方:

          1、以Debug模式啟動服務,左邊的一個按鈕則是以Run模式啟動。在開發中,我一般會直接啟動Debug模式,方便隨時調試代碼。

          2、斷點:在左邊行號欄單擊左鍵,或者快捷鍵Ctrl+F8 打上/取消斷點,斷點行的顏色可自己去設置。

          3、Debug窗口:訪問請求到達第一個斷點后,會自動激活Debug窗口。如果沒有自動激活,可以去設置里設置,如圖1.2。

          4、調試按鈕:一共有8個按鈕,調試的主要功能就對應著這幾個按鈕,鼠標懸停在按鈕上可以查看對應的快捷鍵。在菜單欄Run里可以找到同樣的對應的功能,如圖1.4。

          5、服務按鈕:可以在這里關閉/啟動服務,設置斷點等。

          6、方法調用棧:這里顯示了該線程調試所經過的所有方法,勾選右上角的[Show All Frames]按鈕,就不會顯示其它類庫的方法了,否則這里會有一大堆的方法。

          7、Variables:在變量區可以查看當前斷點之前的當前方法內的變量。

          8、Watches:查看變量,可以將Variables區中的變量拖到Watches中查看



          [圖1.1]

          在設置里勾選Show debug window on breakpoint,則請求進入到斷點后自動激活Debug窗口


          [圖1.2]

          如果你的IDEA底部沒有顯示工具欄或狀態欄,可以在View里打開,顯示出工具欄會方便我們使用??梢宰约喝L試下這四個選項。



          [圖1.3]

          在菜單欄Run里有調試對應的功能,同時可以查看對應的快捷鍵。

          [圖1.4]

          二、基本用法&快捷鍵

          Debug調試的功能主要對應著圖一中4和5兩組按鈕:

          1、首先說第一組按鈕,共8個按鈕,從左到右依次如下:

          [圖2.1]

          • Show Execution Point (Alt + F10):如果你的光標在其它行或其它頁面,點擊這個按鈕可跳轉到當前代碼執行的行。
          • Step Over (F8):步過,一行一行地往下走,如果這一行上有方法不會進入方法。
          • Step Into (F7):步入,如果當前行有方法,可以進入方法內部,一般用于進入自定義方法內,不會進入官方類庫的方法,如第25行的put方法。
          • Force Step Into (Alt + Shift + F7):強制步入,能進入任何方法,查看底層源碼的時候可以用這個進入官方類庫的方法。
          • Step Out (Shift + F8):步出,從步入的方法內退出到方法調用處,此時方法已執行完畢,只是還沒有完成賦值。
          • Drop Frame (默認無):回退斷點,后面章節詳細說明。
          • Run to Cursor (Alt + F9):運行到光標處,你可以將光標定位到你需要查看的那一行,然后使用這個功能,代碼會運行至光標行,而不需要打斷點。
          • Evaluate Expression (Alt + F8):計算表達式,后面章節詳細說明。

          2、第二組按鈕,共7個按鈕,從上到下依次如下:

          [圖2.2]

          • Rerun 'xxxx':重新運行程序,會關閉服務后重新啟動程序。
          • Update 'tech' application (Ctrl + F5):更新程序,一般在你的代碼有改動后可執行這個功能。而這個功能對應的操作則是在服務配置里,如圖2.3。
          • Resume Program (F9):恢復程序,比如,你在第20行和25行有兩個斷點,當前運行至第20行,按F9,則運行到下一個斷點(即第25行),再按F9,則運行完整個流程,因為后面已經沒有斷點了。
          • Pause Program:暫停程序,啟用Debug。目前沒發現具體用法。
          • Stop 'xxx' (Ctrl + F2):連續按兩下,關閉程序。有時候你會發現關閉服務再啟動時,報端口被占用,這是因為沒完全關閉服務的原因,你就需要查殺所有JVM進程了。
          • View Breakpoints (Ctrl + Shift + F8):查看所有斷點,后面章節會涉及到。
          • Mute Breakpoints:啞的斷點,選擇這個后,所有斷點變為灰色,斷點失效,按F9則可以直接運行完程序。再次點擊,斷點變為紅色,有效。如果只想使某一個斷點失效,可以在斷點上右鍵取消Enabled,如圖2.4,則該行斷點失效。

          更新程序,On 'Update' actions,執行更新操作時所做的事情,一般選擇'Update classes and resources',即更新類和資源文件。

          一般配合熱部署插件會更好用,如JRebel,這樣就不用每次更改代碼后還要去重新啟動服務。如何激活JRebel,在最后章節附上。

          下面的On frame deactivation,在IDEA窗口失去焦點時觸發,即一般你從idea切換到瀏覽器的時候,idea會自動幫你做的事情,一般可以設置Do nothing,頻繁切換會比較消耗資源的。

          [圖2.3]

          [圖2.4]

          三、變量查看

          在Debug過程中,跟蹤查看變量的變化是非常必要的,這里就簡單說下IDEA中可以查看變量的幾個地方,相信大部分人都了解。

          1、如下,在IDEA中,參數所在行后面會顯示當前變量的值。

          [圖3.1]

          2、光標懸停到參數上,顯示當前變量信息。點擊打開詳情如圖3.3。我一般會使用這種方式,快捷方便。

          [圖3.2]

          [圖3.3]

          3、在Variables里查看,這里顯示當前方法里的所有變量。

          [圖3.4]

          4、在Watches里,點擊New Watch,輸入需要查看的變量?;蛘呖梢詮腣ariables里拖到Watche里查看。

          [圖3.5]

          如果你發現你沒有Watches,可能在下圖所在的地方。

          [圖3.6]

          [圖3.7]

          四、計算表達式

          在前面提到的計算表達式如圖4.1的按鈕,Evaluate Expression (Alt + F8) ??梢允褂眠@個操作在調試過程中計算某個表達式的值,而不用再去打印信息。


          [圖4.1]

          1、按Alt + F8或按鈕,或者,你可以選中某個表達式再Alt + F8,彈出計算表達式的窗口,如下,回車或點擊Evaluate計算表達式的值。

          這個表達式不僅可以是一般變量或參數,也可以是方法,當你的一行代碼中調用了幾個方法時,就可以通過這種方式查看查看某個方法的返回值。

          [圖4.2]

          2、設置變量,在計算表達式的框里,可以改變變量的值,這樣有時候就能很方便我們去調試各種值的情況了不是。

          [圖4.3]

          五、智能步入

          想想,一行代碼里有好幾個方法,怎么只選擇某一個方法進入。之前提到過使用Step Into (Alt + F7) 或者 Force Step Into (Alt + Shift + F7)進入到方法內部,但這兩個操作會根據方法調用順序依次進入,這比較麻煩。

          那么智能步入就很方便了,智能步入,這個功能在Run里可以看到,Smart Step Into (Shift + F7),如圖5.1

          [圖5.1]

          按Shift + F7,會自動定位到當前斷點行,并列出需要進入的方法,如圖5.2,點擊方法進入方法內部。

          果只有一個方法,則直接進入,類似Force Step Into。

          [圖5.2]

          六、斷點條件設置

          通過設置斷點條件,在滿足條件時,才停在斷點處,否則直接運行。

          通常,當我們在遍歷一個比較大的集合或數組時,在循環內設置了一個斷點,難道我們要一個一個去看變量的值?那肯定很累,說不定你還錯過這個值得重新來一次。

          1、在斷點上右鍵直接設置當前斷點的條件,如圖6.1,我設置exist為true時斷點才生效。

          [圖6.1]

          2、點擊View Breakpoints (Ctrl + Shift + F8),查看所有斷點。

          • Java Line Breakpoints 顯示了所有的斷點,在右邊勾選Condition,設置斷點的條件。
          • 勾選Log message to console,則會將當前斷點行輸出到控制臺,如圖6.3
          • 勾選Evaluate and log,可以在執行這行代碼是計算表達式的值,并將結果輸出到控制臺。

          [圖6.2]

          [圖6.3]

          3、再說說右邊的Filters過濾,這些一般情況下不常用,簡單說下意思。

          • Instance filters:實例過濾,輸入實例ID(如圖6.5中的實例ID),但是我這里沒有成功,不知道什么原因,知道的朋友留個言。
          • Class filters:類過濾,根據類名過濾,同樣沒有成功....
          • Pass count:用于循環中,如果斷點在循環中,可以設置該值,循環多少次后停在斷點處,之后的循環都會停在斷點處。

          [圖6.4]

          [圖6.5]

          4、異常斷點,通過設置異常斷點,在程序中出現需要攔截的異常時,會自動定位到異常行。

          如圖6.6,點擊+號添加Java Exception Breakpoints,添加異常斷點。然后輸入需要斷點的異常類,如圖6.7,之后可以在Java Exception Breakpoints里看到添加的異常斷點。

          我這里添加了一個NullPointerException異常斷點,如圖6.8,出現空指針異常后,自動定位在空指針異常行。

          [圖6.6]

          [圖6.7]

          [圖6.8]

          七、多線程調試

          一般情況下我們調試的時候是在一個線程中的,一步一步往下走。但有時候你會發現在Debug的時候,想發起另外一個請求都無法進行了?

          那是因為IDEA在Debug時默認阻塞級別是ALL,會阻塞其它線程,只有在當前調試線程走完時才會走其它線程??梢栽赩iew Breakpoints里選擇Thread,如圖7.1,然后點擊Make Default設置為默認選項。

          [圖7.1]

          切換線程,在圖7.2中Frames的下拉列表里,可以切換當前的線程,如下我這里有兩個Debug的線程,切換另外一個則進入另一個Debug的線程。

          [圖7.2]

          八、回退斷點

          在調試的時候,想要重新走一下流程而不用再次發起一個請求?

          1、首先認識下這個方法調用棧,如圖8.1,首先請求進入DemoController的insertDemo方法,然后調用insert方法,其它的invoke我們且先不管,最上面的方法是當前斷點所在的方法。

          [圖8.1]

          2、斷點回退

          所謂的斷點回退,其實就是回退到上一個方法調用的開始處,在IDEA里測試無法一行一行地回退或回到到上一個斷點處,而是回到上一個方法。

          回退的方式有兩種,一種是Drop Frame按鈕(圖8.2),按調用的方法逐步回退,包括三方類庫的其它方法(取消Show All Frames按鈕會顯示三方類庫的方法,如圖8.3)。

          第二種方式,在調用棧方法上選擇要回退的方法,右鍵選擇Drop Frame(圖8.4),回退到該方法的上一個方法調用處,此時再按F9(Resume Program),可以看到程序進入到該方法的斷點處了。

          但有一點需要注意,斷點回退只能重新走一下流程,之前的某些參數/數據的狀態已經改變了的是無法回退到之前的狀態的,如對象、集合、更新了數據庫數據等等。

          圖[8.2]

          圖[8.3]

          圖[8.4]

          九、中斷Debug

          想要在Debug的時候,中斷請求,不要再走剩余的流程了?

          有些時候,我們看到傳入的參數有誤后,不想走后面的流程了,怎么中斷這次請求呢(后面的流程要刪除數據庫數據呢....),難道要關閉服務重新啟動程序?嗯,我以前也是這么干的。

          確切的說,我也沒發現可以直接中斷請求的方式(除了關閉服務),但可以通過Force Return,即強制返回來避免后續的流程,如圖9.1。

          點擊Force Return,彈出Return Value的窗口,我這個方法的返回類型為Map,所以,我這里直接返回 results,來強制返回,從而不再進行后續的流程。或者你可以new HashMap<>()。

          [圖9.1]

          [圖9.2]

          家好,我是DD,已經是封閉在家的第51天了!

          最近一直在更新Java新特性(https://www.didispace.com/java-features/)和IDEA Tips(https://www.didispace.com/idea-tips/)兩個原創專欄,其他方向內容的動態關注少了。昨天天晚上刷推的時候,瞄到了這個神奇的東西,覺得挺cool的,拿出來分享下:

          相信你看到圖,不用我說,你也猜到是啥了吧?html里可以跑python代碼了!

          看到好多Python公眾號已經開始猛吹未來了,但乍看怎么覺得有點像JSP?或者一些模版引擎?是進步還是倒退呢?與其瞎想,不如仔細看看這個東東的能力吧!

          根據官方介紹,這個名為PyScript的框架,其核心目標是為開發者提供在標準HTML中嵌入Python代碼的能力,使用 Python調用JavaScript函數庫,并以此實現利用Python創建Web應用的功能。

          看到介紹里提到了調用JavaScript函數庫的能力,看來跟JSP或者模版引擎還是有區別的。

          PyScript 快速體驗

          官方給了一個例子,可以幫助我們觀的感受這個開發框架的能力,不妨跟著DD看看,它能做啥吧!

          第一個案例,hello world

          代碼很簡單,就下面這幾行。你只需要創建一個html文件,然后復制進去就可以了。

          <html>
            <head>
              <link rel="stylesheet" href="https://pyscript.net/alpha/pyscript.css" />
              <script defer src="https://pyscript.net/alpha/pyscript.js"></script>
            </head>
            <body> 
              <py-script> 
                  print('Hello, World!') 
              </py-script> 
            </body>
          </html>
          

          保存好之后,在瀏覽器里打開就能看到這樣的頁面了:

          回頭再看看這個html里的內容,三個核心內容:

          • 引入pyscript的樣式文件:<link rel="stylesheet" href="https://pyscript.net/alpha/pyscript.css" />
          • 引入pyscript的腳本文件:<script defer src="https://pyscript.net/alpha/pyscript.js"></script>
          • <py-script>標簽中寫具體的python代碼來輸出Hello World

          如果你懶得自己敲代碼的話,本文的兩個案例代碼我打包放在公眾號了,需要的朋友可以關注公眾號“程序猿DD”,回復:pyscript 獲取。

          第二個案例,數據定義 + 數據展示

          先創建一個data.py文件,然后加入前面的代碼。功能很簡單,就是隨機生成(x,y)的坐標

          import numpy as np
          
          def make_x_and_y(n):
              x=np.random.randn(n)
              y=np.random.randn(n)
              return x, y
          

          再創建一個html文件,加入下面的代碼

          <html>
              <head>
                <link rel="stylesheet" href="https://pyscript.net/alpha/pyscript.css" />
                <script defer src="https://pyscript.net/alpha/pyscript.js"></script>
                <py-env>
                  - numpy
                  - matplotlib
                  - paths:
                    - /data.py
                </py-env>
              </head>
          
            <body>
              <h1>Let's plot random numbers</h1>
              <div id="plot"></div>
              <py-script output="plot">
              import matplotlib.pyplot as plt
              from data import make_x_and_y
          
              x, y=make_x_and_y(n=1000)
          
              fig, ax=plt.subplots()
              ax.scatter(x, y)
              fig
              </py-script>
            </body>
          </html>
          

          這里就稍微復雜一些了,除了hello world中的幾個要點外,這里還有這幾個要關注的地方:

          • <py-env>標簽:這里聲明要引入的包和要引入的文件(上面創建的data.py
          • <py-script output="plot">:這里定義了要在<div id="plot"></div>中輸出的內容,可以看到這里的邏輯都是用python寫的

          這個頁面的執行效果是這樣的:

          是不是很神奇呢?整個過程中都沒有大家熟悉的cs、js內容,就完成了這樣一個圖的頁面實現。

          小結

          最后,談談在整個嘗試過程中,給我的幾個感受:

          1. 開發體驗上高度統一,對于python開發者來說,開發Web應用的門檻可以更低了
          2. 感覺性能上似乎有所不足,幾個復雜的案例執行有點慢,開始以為是部分國外cdn的緣故,后來移到本地后,還是慢。這部分可能還需要進一步優化。

          這個開發框架目前還只是alpha版本,未來一定還會有更多特性與優化出來,總體上我覺得這個框架還是非常cool的,尤其對于剛學會Python,或者只會Python,但又想快速開發Web應用的小伙伴來說,可能將會是個不錯的選擇,那你覺得這個框架如何?未來會不會火?留言區聊聊吧!

          擊關注,快速進階高級架構師

          作者:G_Seinfeld

          閑話

          工欲善其事,必先利其器。

          一款好的IDE(集成開發環境,Integrated Development Environment)對于程序員就像一把好的兵器對于武將一樣重要,這句話對于Java這種笨重的語言而言尤其適用。好在Java有了集美貌與智慧于一身的IDE——Intellij IDEA,它就像二爺的赤兔馬和青龍偃月刀一樣在Java世界中奮勇殺敵。如果你在使用Eclipse或者Netbeans之類的IDE,在繼續閱讀之前我建議你嘗試一下Intellij IDEA,你會愛上它的。如果你已經在使用IDEA了,這篇文章會給你一些進階應用的指南,讓你的神兵用起來更加得心應手。今天我們主要介紹一下IDEA的語言注入功能、自定義代碼模板以及簡單的重構技巧。

          干貨

          語言注入(language injection)

          語言注入是指在Java的字符串里書寫另一種語言時將該語言的特征(高亮、語法檢查等)注入到字符串中。比如,有時我們需要用Java字符串來表達SQL語句、JSON串或者正則表達式。這時我們可以在要注入的字符串中按Alt+Enter,如下圖:

          language injection

          然后選擇Inject language or reference

          select language

          比如這里我們選擇JSON,我們可以看到JSON字符串的key部分被高亮了:

          json

          如果選擇的語言有自動補全的功能,在這里也可以直接使用自動補全功能。如果語法不符合該語言的語法,也會有編譯器的錯誤提示。總之,就像你真的再寫這種語言一樣。但是有一點不爽的是,在字符串里面需要注意轉義的事情。IDEA的設計者顯然也考慮到了這個問題,因此還提供了Edit XXX Fragment的功能,其中XXX是指你注入的語言。

          edit fragment

          在已經注入語言的字符串上再次按Alt+Enter,選擇Edit XXX Fragment,彈出下面的輸入窗,可以在該窗口中直接書寫相應的語言,在上面的字符串中,IDEA會自動替你將該轉義的東西轉義掉,這點對于寫正則表達式而言特別方便。順便一提,如果你注入的是正則表達式的話,IDEA還提供了Check RegExp功能,用于檢查你指定的字符串與正則表達式是否匹配。

          除了使用上面提到的方式進行語言注入外,還可以通過添加注釋的方式進行語言注入,即在需要注入的字符串上方寫入形如

          // language=LANG prefix=PRE suffix=SUF
          

          的注釋,其中LANG是你要注入的語言,prefix和suffix分別是指定的前后綴,如果沒有可以省略。如果你的字符串表達的不是一個完整的語言片段,可以通過前后綴的拼接使其形成一個完整的語言片段,如下圖的html示例:

          comment injection

          自定義代碼模板(live templates)

          live templates是IDEA中提高代碼編寫速度,減少重復性工作的又一大利器。用過IDEA的人應該基本都使用過內置的代碼模板,只不過可能不知道而已。下面列舉幾個常用的live templates:

          • psvm大法

          是public static void main的縮寫,依次敲入這幾個字母可以在一個類中快速生成main方法。

          public static void main(String[] args) {
           
          }
          
          • sout大法

          用于快速生成輸出語句

          System.out.println();
          
          • psfs (字符串常量)

          用于快速生成字符串常量

          public static final String
          
          • fori (普通for循環)
          • 用于快速生成普通for循環的代碼
          for (int i=0; i < ; i++) {
           
          }
          
          • iter (增強for循環)

          用于快速生成增強for循環代碼,其中要遍歷的對象以及元素類型可以推斷,元素對象名稱可以推薦。

          for (String key : map.keySet()) {
           
          }
          
          • ifn (if null)

          用于生成判空的條件判斷語句,判斷的對象自動推斷

          if (s==null) {
          }
          
          • inn(if not null)

          用于生成判斷非空的條件判斷語句,判斷的對象自動推斷

          if (s !=null) {
          }
          

          這些官方提供的內置模板已經足夠nice,但是可能不能充分滿足我們自己特殊場景的使用。我們可以根據自身使用的情況DIY我們自己的模板。那么怎么定義我們自己的代碼模板呢?

          首先按Ctrl+Alt+S打開設置(或者點擊File-Settings),找到Editor下的Live Templates選項,進入自定義模板頁面。

          live templates

          這里默認是按照語言和用途分的組,我們可以新增自己的模板組,點擊右上角的小加號,選擇template group即可。接下來是在已有組中增加模板,點擊右上角的小加號,選擇live template?;蛘呃矛F有的模板進行duplicate(右上角第三個按鈕)也可以。比如我們新建一個待辦事項的注釋,想要指定用戶和時間:

          todo

          我們首先增加一個自定義模板組comment,在下面添加一個todo模板,在Abbreviation(縮寫)里面寫入todo,即寫代碼時要輸入的模板簡寫,在右邊description中輸入模板的描述信息,在下面Template text中寫入模板內容:

          //TODO $DATE$ $USER$: $END$
          

          其中//TODO是Java中待辦事項的注釋,后面DATE和USER是自定義的變量,分別代表日期和用戶,END是IDEA內置的變量,代表生成模板后光標所處的位置。很容易想到,兩個美元符號$$中間加上大寫字母是模板中定義變量的方式。那么這些變量怎么取值呢,我們點擊右側的Edit variables按鈕,就可以看到這樣的界面:

          edit variables

          這里可以看到DATE和USER變量的取值,分別為date()和user(),date()和user()是IDEA內置的兩個函數,用于表征當前時間和當前系統用戶,如果Expression(表達式)項沒有取到值,我們還可以在Default value中設置默認值,不過不是所有項都可以走默認值的,勾選右邊的復選框代表如果變量取到確切值,光標直接跳過此處。IDEA提供了幾十個內置函數,用于處理模板中的各種情況,內置函數的完整列表可以參見官方文檔

          (https://www.jetbrains.com/help/idea/template-variables.html#predefined_functions)。

          重構(refactor)

          重構是編寫代碼的一個重要環節,它是在基本不改變代碼語義的前提下,對代碼直觀性、可讀性以及代碼邏輯層次進行的改造。重構的技巧非常多,大牛們經?;ㄒ槐緯膬热輥斫榻B重構。這里我們只介紹怎么在IDEA中方便地進行常見的代碼重構。首先先普及一樣IDEA中萬能重構的快捷鍵:Ctrl+Alt+Shift+T,一切重構都可以以此為入口。在IDEA中最常用的重構主要包括重命名(rename)、代碼提?。╡xtract)、代碼嵌入(inline)。

          • rename

          重命名,或者叫改名。有時候我們會覺得類、方法、變量名稱不能準確表達我們要傳遞給讀者的含義,此時我們就需要重命名。IDEA中重命名的快捷鍵是Shift+F6,當然也可以從萬能入口進入。重命名后所有調用之處會自動修改引用的名稱。

          • extract

          代碼提取,可以指從實現類中提取接口或父類,也可以指從代碼中提取方法。下面說一些常見的場景:

          1. 當我們發現一段代碼在一個邏輯層面上不止做了一件事時,我們就需要將代碼提取成一個方法。
          2. 當系統中出現兩處以上重復代碼時,我們也需要將重復代碼提取成公共方法。
          3. 當系統不希望將過多細節暴露給開發者時,我們需要將實現類提取成接口。
          4. 不同的代碼提取對應不同的快捷鍵,建議直接從萬能入口進入。
          • inline
          • 嵌入是提取的逆過程。下面是一些常見場景:
          1. 當我們刪除一個被多次引用的空函數時,我們就需要對這些空函數進行inline操作。
          2. 當我們發現代碼的邏輯層次發生改變,需要提升邏輯層級時,可以用到inline操作。
          3. 消除只出現一次的局部變量可以使用inline操作。

          最佳實踐

          1. 在Java字符串中書寫其他語言時,使用語言注入,這樣可以避免語法的錯誤,也不必手動對特殊字符進行轉義。
          2. 將常用的代碼片段提取成live templates,這樣可以快速生成代碼,減少重復工作量。
          3. 經常重構自己的代碼,提高代碼的可讀性和直觀程度。
          4. 在編寫接口和實現類時,先編寫實現類,再提取成接口。

          鏈接:https://www.jianshu.com/p/cc08f90a5102

          簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權并注明出處。


          主站蜘蛛池模板: 在线观看一区二区三区视频| 少妇激情一区二区三区视频 | 亚洲AV综合色区无码一区| 精品久久久久中文字幕一区| 视频在线一区二区| 狠狠爱无码一区二区三区| 亚洲一区视频在线播放| 日本不卡一区二区三区| 色狠狠色狠狠综合一区| 日本免费一区二区三区最新| 一区 二区 三区 中文字幕| 国产丝袜美女一区二区三区| 麻豆国产一区二区在线观看| 精品一区二区久久久久久久网精| 影院无码人妻精品一区二区| 亚洲av不卡一区二区三区| 日韩一区二区超清视频| 视频一区二区中文字幕| 国产成人久久精品一区二区三区| 国产99久久精品一区二区| 精品不卡一区中文字幕| 亚洲国产精品第一区二区 | 国产成人精品一区二区A片带套| 日本一区二区三区在线视频观看免费 | 成人H动漫精品一区二区| 亚洲性日韩精品国产一区二区| 高清国产AV一区二区三区| 午夜视频一区二区三区| 中文字幕永久一区二区三区在线观看| 久久久久人妻精品一区| 国产在线视频一区二区三区| 亚洲av无码一区二区三区不卡| 国产乱码精品一区二区三区四川人| 国产91一区二区在线播放不卡| 一区二区三区精密机械| 成人无码AV一区二区| 日韩成人一区ftp在线播放| 亚洲AV乱码一区二区三区林ゆな| 一区二区精品视频| 亚洲AV日韩综合一区| 亚洲AV午夜福利精品一区二区|