日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

oracle密码不能重复用_重复码

發(fā)布時(shí)間:2023/12/3 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle密码不能重复用_重复码 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

oracle密碼不能重復(fù)用

介紹

在我們的Java應(yīng)用程序中復(fù)制/粘貼代碼通常不好,但是有時(shí)這是不可避免的。 例如,項(xiàng)目License3j在Feature類中為其支持的每種XXX類型提供了一個(gè)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

應(yīng)用程序支持的每種功能類型。 那里有一些類型:Binary,String,Byte,Short,Int,Long,Float,Double,BigInteger,BigDecimal,Date,UUID。 鍵入所有非常相似的方法不僅是無聊的任務(wù),而且容易出錯(cuò)。 很少有人擅長執(zhí)行此類重復(fù)性任務(wù)。 為了避免這種情況,我們可以使用Java :: Geci框架,作為最簡單的解決方案,我們可以使用生成器Iterate。

POM依賴

要使用生成器,我們必須添加依賴項(xiàng)

< dependency > < groupId >com.javax0.geci</ groupId > < artifactId >javageci-core</ artifactId > < scope >test</ scope > < version >1.4.0</ version > </ dependency >

該庫僅在測試運(yùn)行期間執(zhí)行,因此使用它并不意味著任何額外的依賴關(guān)系。 誰想要使用許可證3j庫都不需要使用Java :: Geci。 這只是test范圍中使用的開發(fā)工具。

運(yùn)行它的單元測試

依賴關(guān)系不會(huì)自行運(yùn)行。 畢竟,依賴不是程序。 它是打包到JAR中的一堆類文件,可在類路徑上使用。 我們必須執(zhí)行生成器,并且必須通過創(chuàng)建單元測試的框架來完成:

@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() ); }

它創(chuàng)建一個(gè)Geci對(duì)象,使用生成器實(shí)例Geci ,然后在已配置的框架Geci對(duì)象上調(diào)用generate() 。 就目前而言, define()調(diào)用似乎有點(diǎn)神秘。 稍后我們將闡明這一點(diǎn)。

源代碼準(zhǔn)備

執(zhí)行構(gòu)建之前的最后一步是定義模板以及要插入模板的值。 無需編寫所有方法,而是編寫模板和編輯器折疊段:

/* 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>

當(dāng)我們通過框架執(zhí)行生成器時(shí),它將為占位符Type每個(gè)值評(píng)估模板,并將每個(gè){{Type}}替換為實(shí)際值。 生成的代碼將插入id “ iterate”的編輯器折疊段中。

查看模板,您會(huì)發(fā)現(xiàn)有一個(gè)占位符{{TYPE}} ,未在列表中定義。 這是統(tǒng)一測試define()進(jìn)入圖片的地方。 它定義了一個(gè)使用上下文的使用者,并使用該上下文讀取Type的實(shí)際值,創(chuàng)建該值的大寫版本并將其分配給名為TYPE的段參數(shù)。

通常就是這樣。 使用生成器還有其他功能,例如在每次迭代中定義分配給不同占位符的多個(gè)值,轉(zhuǎn)義或跳過行等。 關(guān)于這些內(nèi)容的摘錄是您可以閱讀文檔的摘錄,您可以閱讀最新且完整的內(nèi)容https://github.com/verhas/javageci/blob/master/ITERATE.adoc

文件摘錄

在要使用生成器的Java源文件中,必須使用注釋@Geci("iterate")來注釋該類。
您也可以改用@Iterate批注,該批注在
javageci-core-annotations模塊。 這將指示Geci框架您要在給定類中使用iterate生成器。

TEMPLATE

模板在/\*TEMPLATE或TEMPLATE行之后開始。
/*和單詞之間前后可以有空格
TEMPLATE但線上不應(yīng)有其他任何東西。 當(dāng)生成器看到這樣的行時(shí),它將開始收集以下行作為模板的內(nèi)容。

模板的末尾由一行上帶有*/信號(hào)線表示,沒有其他內(nèi)容(空格除外)。

模板的內(nèi)容可以包含{{和}}之間的參數(shù)
字符,與小胡子模板程序使用的字符類似。
(生成器不使用胡須,模板處理更為簡單。)

LOOP

在收集模板的行時(shí),某些行被識(shí)別為模板的參數(shù)定義。 這些行不會(huì)進(jìn)入模板的主干。 (這些行上的命令名稱始終為大寫。)

如您在簡介中所見

LOOP type =int|long|short

不是模板文本的一部分。 它通過類型指示發(fā)生器迭代并設(shè)置參數(shù){{type}}在文本到int第一, long第二和short的最后。 這樣,您可以遍歷單個(gè)參數(shù)的多個(gè)值。

更復(fù)雜的模板可能需要多個(gè)參數(shù)。 在這種情況下,您可以將它們在LOOP行中列出為

LOOP type ,var=int,aInt|long,aLong|short,aShort

這將告訴生成器將參數(shù)設(shè)置{{type}}相同的方式,前三個(gè)迭代,但同時(shí)也設(shè)置了參數(shù){{var}}到aInt在第一循環(huán)中,以aLong在第二循環(huán)中和最后一個(gè)循環(huán)中的aShort 。

如果值列表太長,則可以將列表分成多條LOOP行。 但是,在這種情況下,必須在第二行,第三行等在LOOP行中重復(fù)這些變量。
它們的順序可能不同,但是如果某些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

默認(rèn)

從文件的開頭到結(jié)尾處理模板,并按此順序準(zhǔn)備生成的代碼。
生成的代碼的內(nèi)容將直接插入模板e(cuò)ditor-fold的editor-fold段中。 雖然這樣的id的
editor-fold段并不是很有趣,您必須為每個(gè)段指定一個(gè)唯一的id 。 這是Java :: Geci框架的限制。

進(jìn)階使用

EDITOR-FOLD-ID

您可能會(huì)遇到多個(gè)模板,這些模板遍歷不同的值,并且您希望結(jié)果進(jìn)入相同的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; } // }

生成的代碼進(jìn)入具有id名稱的editor-fold
getters即使這不是遵循模板定義的getters 。

使用此功能可以將生成的代碼從多個(gè)迭代模板發(fā)送到單個(gè)段中。 通常,將模板和段保持在一起是一個(gè)好習(xí)慣。

ESCAPE和SKIP

模板的結(jié)尾由*/ 。 這實(shí)質(zhì)上是評(píng)論的結(jié)尾。 如果要在模板中包含注釋(如JavaDoc),會(huì)發(fā)生什么情況。 您可以在注釋行的末尾添加*/字符,但其中仍包含一些字符。 該解決方案不是很好,它實(shí)際上是一種解決方法。

要有一條完全是注釋結(jié)尾的行,或者是任何可以由模板處理解釋的行,例如LOOP行,您應(yīng)該在前一行中有一行,其中只包含ESCAPE 。 這將告訴模板處理將下一行包括在模板文本中,并在此后的行繼續(xù)進(jìn)行正常處理。

同樣,您可以使用SKIP行來完全忽略以下行。
使用這兩個(gè)命令,您可以將任何內(nèi)容包括到模板中。

一個(gè)示例顯示了如何將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; } // }

模板以注釋開頭,并且注釋實(shí)際上可以包含任何其他開頭的注釋。 Java注釋不嵌套。 模板的末尾是包含*/字符串的行。 我們希望該行成為模板的一部分,因此我們在該行之前
ESCAPE因此它不會(huì)被解釋為模板的末尾。 另一方面,對(duì)于Java,這將結(jié)束注釋。 要繼續(xù)模板,我們必須“返回”注釋模式,因?yàn)槲覀儾幌M鸍ava編譯器將模板作為代碼來處理。 (最后但并非最不重要的一點(diǎn)是,因?yàn)槭褂谜嘉环哪0蹇赡懿皇钦Z法上正確的Java代碼片段。)我們需要一個(gè)新的/*行,我們不想進(jìn)入模板。
因此,此行之前包含// SKIP的行。 (跳過行在命令前可以具有// 。)

您可以在生成的代碼中看到的結(jié)果。 所有方法都具有正確的JavaDoc文檔。

SEP1和SEP2

遍歷值已與占位符的名字分開,并且| 值列表。 例如,上面的示例包含

LOOP type ,variable=int,i|long,l|short,s

兩個(gè)占位符名稱type和variable ,每個(gè)占位符三個(gè)值。
占位符不需要包含特殊字符,如果它們是標(biāo)準(zhǔn)標(biāo)識(shí)符,則最好。 但是,這些值可能包含逗號(hào)或豎線。 在這種情況下,你可以重新定義字符串(不僅是單個(gè)字符),模板LOOP命令可以改用單一字符串,和| 。

例如線

SEP1 /

表示名稱和值應(yīng)以/分隔,而不是一個(gè)和

SEP2 &

的值的列表應(yīng)當(dāng)由一個(gè)字符分隔&
串。 SEP1和SEP2僅在它們之前
LOOP命令,它們僅對(duì)所使用的模板有效。遵循上述命令, LOOP示例將如下所示:

LOOP type /variable =int /i &long /l &short /s

這樣,沒有什么可以阻止我們添加另一個(gè)值列表

LOOP type /variable =int /i &long /l &short /s &byte,int /z

最終將導(dǎo)致示例模板出現(xiàn)語法錯(cuò)誤,但演示了重新定義名稱和值列表分隔符的要點(diǎn)。

組態(tài)

生成器由Geci框架支持的配置工具實(shí)現(xiàn),并且所有參數(shù)都是可配置的。 您可以在創(chuàng)建注釋器的單元測試中,類的注釋中或在編輯器折疊參數(shù)中,重新定義與模板的開始,結(jié)束,跳過等行匹配的正則表達(dá)式。

帶走

迭代生成器是一種非常易于使用的生成器,用于創(chuàng)建重復(fù)的代碼。 這也是主要的危險(xiǎn):您應(yīng)該足夠強(qiáng)大才能找到更好的解決方案,并僅在最佳解決方案時(shí)才使用它。

翻譯自: https://www.javacodegeeks.com/2019/11/repeated-code.html

oracle密碼不能重復(fù)用

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的oracle密码不能重复用_重复码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。