oracle密码不能重复用_重复码
oracle密碼不能重復用
介紹
在我們的Java應用程序中復制/粘貼代碼通常不好,但是有時這是不可避免的。 例如,項目License3j在Feature類中為其支持的每種XXX類型提供了一個isXXX方法。 在這種情況下,我們做不到寫
public boolean isBinary() { return type == Type.BINARY; } public boolean isString() { return type == Type.STRING; } public boolean isByte() { return type == Type.BYTE; } public boolean isShort() { return type == Type.SHORT; } and so on應用程序支持的每種功能類型。 那里有一些類型:Binary,String,Byte,Short,Int,Long,Float,Double,BigInteger,BigDecimal,Date,UUID。 鍵入所有非常相似的方法不僅是無聊的任務,而且容易出錯。 很少有人擅長執行此類重復性任務。 為了避免這種情況,我們可以使用Java :: Geci框架,作為最簡單的解決方案,我們可以使用生成器Iterate。
POM依賴
要使用生成器,我們必須添加依賴項
< dependency > < groupId >com.javax0.geci</ groupId > < artifactId >javageci-core</ artifactId > < scope >test</ scope > < version >1.4.0</ version > </ dependency >該庫僅在測試運行期間執行,因此使用它并不意味著任何額外的依賴關系。 誰想要使用許可證3j庫都不需要使用Java :: Geci。 這只是test范圍中使用的開發工具。
運行它的單元測試
依賴關系不會自行運行。 畢竟,依賴不是程序。 它是打包到JAR中的一堆類文件,可在類路徑上使用。 我們必須執行生成器,并且必須通過創建單元測試的框架來完成:
@Test @DisplayName ( "run Iterate on the sources" ) void runIterate() throws IOException { Geci geci = new Geci(); Assertions.assertFalse( geci.register(Iterate.builder() .define(ctx -> ctx.segment().param( "TYPE" , ctx.segment().getParam( "Type" ).orElse( "" ).toUpperCase())) .build()) .generate() , geci.failed() ); }它創建一個Geci對象,使用生成器實例Geci ,然后在已配置的框架Geci對象上調用generate() 。 就目前而言, define()調用似乎有點神秘。 稍后我們將闡明這一點。
源代碼準備
執行構建之前的最后一步是定義模板以及要插入模板的值。 無需編寫所有方法,而是編寫模板和編輯器折疊段:
/* TEMPLATE LOOP Type=Binary|String|Byte|Short|Int|Long|Float|Double|BigInteger|BigDecimal|Date|UUID public boolean is{{Type}}() { return type == Type.{{TYPE}}; } */ //<editor-fold id="iterate"> //</editor-fold>當我們通過框架執行生成器時,它將為占位符Type每個值評估模板,并將每個{{Type}}替換為實際值。 生成的代碼將插入id “ iterate”的編輯器折疊段中。
查看模板,您會發現有一個占位符{{TYPE}} ,未在列表中定義。 這是統一測試define()進入圖片的地方。 它定義了一個使用上下文的使用者,并使用該上下文讀取Type的實際值,創建該值的大寫版本并將其分配給名為TYPE的段參數。
通常就是這樣。 使用生成器還有其他功能,例如在每次迭代中定義分配給不同占位符的多個值,轉義或跳過行等。 關于這些內容的摘錄是您可以閱讀文檔的摘錄,您可以閱讀最新且完整的內容https://github.com/verhas/javageci/blob/master/ITERATE.adoc
文件摘錄
在要使用生成器的Java源文件中,必須使用注釋@Geci("iterate")來注釋該類。
您也可以改用@Iterate批注,該批注在
javageci-core-annotations模塊。 這將指示Geci框架您要在給定類中使用iterate生成器。
TEMPLATE
模板在/\*TEMPLATE或TEMPLATE行之后開始。
/*和單詞之間前后可以有空格
TEMPLATE但線上不應有其他任何東西。 當生成器看到這樣的行時,它將開始收集以下行作為模板的內容。
模板的末尾由一行上帶有*/信號線表示,沒有其他內容(空格除外)。
模板的內容可以包含{{和}}之間的參數
字符,與小胡子模板程序使用的字符類似。
(生成器不使用胡須,模板處理更為簡單。)
LOOP
在收集模板的行時,某些行被識別為模板的參數定義。 這些行不會進入模板的主干。 (這些行上的命令名稱始終為大寫。)
如您在簡介中所見
LOOP type =int|long|short不是模板文本的一部分。 它通過類型指示發生器迭代并設置參數{{type}}在文本到int第一, long第二和short的最后。 這樣,您可以遍歷單個參數的多個值。
更復雜的模板可能需要多個參數。 在這種情況下,您可以將它們在LOOP行中列出為
LOOP type ,var=int,aInt|long,aLong|short,aShort這將告訴生成器將參數設置{{type}}相同的方式,前三個迭代,但同時也設置了參數{{var}}到aInt在第一循環中,以aLong在第二循環中和最后一個循環中的aShort 。
如果值列表太長,則可以將列表分成多條LOOP行。 但是,在這種情況下,必須在第二行,第三行等在LOOP行中重復這些變量。
它們的順序可能不同,但是如果某些LOOP行中存在未定義的變量,則將解析引用該變量的占位符,并將其保留為{{placeholder}}形式。
上面的例子也可以寫成
LOOP type ,var=int,aInt LOOP var, type =aLong,long LOOP type ,var=short,aShort并得出與上述LOOP相同的值:
LOOP type ,var=int,aInt|long,aLong|short,aShort默認
從文件的開頭到結尾處理模板,并按此順序準備生成的代碼。
生成的代碼的內容將直接插入模板editor-fold的editor-fold段中。 雖然這樣的id的
editor-fold段并不是很有趣,您必須為每個段指定一個唯一的id 。 這是Java :: Geci框架的限制。
進階使用
EDITOR-FOLD-ID
您可能會遇到多個模板,這些模板遍歷不同的值,并且您希望結果進入相同的editor-fold
分割。 可以使用EDITOR_FOLD_ID 。
在下面的例子中
package javax0.geci.iterate.sutclasses; public class IterateOverMultipleValues { /* TEMPLATE {{ type }} get_{{ type }}Value(){ {{ type }} {{variable}} = 0; return {{variable}}; } LOOP type ,variable=int,i|long,l|short,s EDITOR-FOLD-ID getters */ // // nothing gets here // // int get_intValue(){ int i = 0; return i; } long get_longValue(){ long l = 0; return l; } short get_shortValue(){ short s = 0; return s; } // } 生成的代碼進入具有id名稱的editor-fold
getters即使這不是遵循模板定義的getters 。
使用此功能可以將生成的代碼從多個迭代模板發送到單個段中。 通常,將模板和段保持在一起是一個好習慣。
ESCAPE和SKIP
模板的結尾由*/ 。 這實質上是評論的結尾。 如果要在模板中包含注釋(如JavaDoc),會發生什么情況。 您可以在注釋行的末尾添加*/字符,但其中仍包含一些字符。 該解決方案不是很好,它實際上是一種解決方法。
要有一條完全是注釋結尾的行,或者是任何可以由模板處理解釋的行,例如LOOP行,您應該在前一行中有一行,其中只包含ESCAPE 。 這將告訴模板處理將下一行包括在模板文本中,并在此后的行繼續進行正常處理。
同樣,您可以使用SKIP行來完全忽略以下行。
使用這兩個命令,您可以將任何內容包括到模板中。
一個示例顯示了如何將JavaDoc注釋包括到模板中:
package javax0.geci.iterate.sutclasses; public class SkippedLines { /* TEMPLATE /** * A simple zero getter serving as a test example * @ return zero in the type {{ type }} ESCAPE */ // SKIP /* {{ type }} get_{{ type }}Value(){ {{ type }} {{variable}} = 0; return {{variable}}; } LOOP type ,variable=int,i|long,l|short,s EDITOR-FOLD-ID getters */ // /** * A simple zero getter serving as a test example * @ return zero in the type int */ int get_intValue(){ int i = 0; return i; } /** * A simple zero getter serving as a test example * @ return zero in the type long */ long get_longValue(){ long l = 0; return l; } /** * A simple zero getter serving as a test example * @ return zero in the type short */ short get_shortValue(){ short s = 0; return s; } // } 模板以注釋開頭,并且注釋實際上可以包含任何其他開頭的注釋。 Java注釋不嵌套。 模板的末尾是包含*/字符串的行。 我們希望該行成為模板的一部分,因此我們在該行之前
ESCAPE因此它不會被解釋為模板的末尾。 另一方面,對于Java,這將結束注釋。 要繼續模板,我們必須“返回”注釋模式,因為我們不希望Java編譯器將模板作為代碼來處理。 (最后但并非最不重要的一點是,因為使用占位符的模板可能不是語法上正確的Java代碼片段。)我們需要一個新的/*行,我們不想進入模板。
因此,此行之前包含// SKIP的行。 (跳過行在命令前可以具有// 。)
您可以在生成的代碼中看到的結果。 所有方法都具有正確的JavaDoc文檔。
SEP1和SEP2
遍歷值已與占位符的名字分開,并且| 值列表。 例如,上面的示例包含
LOOP type ,variable=int,i|long,l|short,s 兩個占位符名稱type和variable ,每個占位符三個值。
占位符不需要包含特殊字符,如果它們是標準標識符,則最好。 但是,這些值可能包含逗號或豎線。 在這種情況下,你可以重新定義字符串(不僅是單個字符),模板LOOP命令可以改用單一字符串,和| 。
例如線
SEP1 /表示名稱和值應以/分隔,而不是一個和
SEP2 & 的值的列表應當由一個字符分隔&
串。 SEP1和SEP2僅在它們之前
LOOP命令,它們僅對所使用的模板有效。遵循上述命令, LOOP示例將如下所示:
這樣,沒有什么可以阻止我們添加另一個值列表
LOOP type /variable =int /i &long /l &short /s &byte,int /z最終將導致示例模板出現語法錯誤,但演示了重新定義名稱和值列表分隔符的要點。
組態
生成器由Geci框架支持的配置工具實現,并且所有參數都是可配置的。 您可以在創建注釋器的單元測試中,類的注釋中或在編輯器折疊參數中,重新定義與模板的開始,結束,跳過等行匹配的正則表達式。
帶走
迭代生成器是一種非常易于使用的生成器,用于創建重復的代碼。 這也是主要的危險:您應該足夠強大才能找到更好的解決方案,并僅在最佳解決方案時才使用它。
翻譯自: https://www.javacodegeeks.com/2019/11/repeated-code.html
oracle密碼不能重復用
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的oracle密码不能重复用_重复码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 四脚踏雪的狗寓意(为什么有人说四蹄踏雪的
- 下一篇: 电脑上如何看vr视频(电脑上如何看vr视