Upgrade to Pro — share decks privately, control downloads, hide ads and more …

String Templateによる文字列補間

String Templateによる文字列補間

2023-11-11 JJUG CCC セッション資料
String Templateによる文字列補間

Yuichi.Sakuraba

November 10, 2023
Tweet

More Decks by Yuichi.Sakuraba

Other Decks in Technology

Transcript

  1. を変数で切り替えたい “Hello, World!” World + 演算子 “Hello, ” + name

    + “!”; StringBuilder new StringBuilder(“Hello, ”) .append(name) .append(“!”) .toString(); 変数が多いとコードを読み書きしにくい ...
  2. を変数で切り替えたい “Hello, World!” World String.format() or java.util.Formatter String.format(“Hello, %s”, name);

    new Formatter().format(“Hello, %s”, name) .toString(); = java.text.MessageFormat MessageFormat.format(“Hello, {0}”, name); 変数が多いとフォーマット記述子と変数の対応が ...
  3. String Templates の書き方 STR.”Hello \{name}!” テンプレート プロセッサ テンプレート引数 } }

    変数 / 式 埋め込み テンプレートプロセッサ java.lang.StringTemplate.Processor 関数型インタフェース processメソッド 標準で提供 STR, FMT, RAW テンプレート引数 文字列リテラル テキストブロック
  4. java.lang.StringTemplate.STR 文字列を生成する最も基本的なテンプレートプロセッサ せずとも使用可能 static import WBSYWBSZ 453za\Y^ a\Z^a\Y Z^z z

    z WBSUPEBZ-PDBM%BUFOPX  453zzz 5PEBZJTa\UPEBZ^ a\TXJUDI UPEBZHFU%BZ0G8FFL \ DBTF4"563%": 46/%":l8FFLFOEz EFGBVMUl8FFLEBZz ^^lzz z5PEBZJT 8FFLFOEz
  5. String Templates の動作 により実行 invokeDynamic 453z)FMMP a\OBNF^z 要素ごとに分解 z)FMMP l

    OBNF lz z)FMMP l OBNFlz -JTU4USJOHGSBHNFOUT -JTU0CKFDUWBMVFT 文字列と値を別々にまとめる WBSTU4USJOH5FNQMBUFPG GSBHNFOUT WBMVFT オブジェクト生成 StringTemplate 453QSPDFTT TU  メソッドコール Processor.process
  6. Custom Template Processor 特定用途向け Template Processor 文字列以外を返すことも可能 QVCMJDJOUFSGBDF4USJOH5FNQMBUF\ QVCMJDJOUFSGBDF1SPDFTTPS3 &FYUFOET5ISPXBCMF\

    3QSPDFTT 4USJOH5FNQMBUFTUSJOH5FNQMBUF UISPXT& TUBUJD51SPDFTTPS5 3VOUJNF&YDFQUJPOPG 'VODUJPO TVQFS4USJOH5FNQMBUF  FYUFOET5QSPDFTT \^ ^  ^ 例外を扱うのであれば をオーバーライド process 例外を使用しない場合 をコール of
  7. of メソッドによるカスタマイズ と同等の STR Template Processor 4USJOH5FNQMBUF1SPDFTTPS4USJOH 3VOUJNF&YDFQUJPOQSPD 4USJOH5FNQMBUF1SPDFTTPSPG TU\

    *UFSBUPS4USJOHJUTUGSBHNFOUT JUFSBUPS  WBSTCOFX4USJOH#VJMEFS JUOFYU  GPS 0CKFDUPCKTUWBMVFT \ TCBQQFOE PCK  TCBQQFOE JUOFYU  ^ SFUVSOTCUP4USJOH  ^ 
  8. Processor インタフェースをラムダ式で記述 を許容しない null Template Processor 4USJOH5FNQMBUF1SPDFTTPS4USJOH /VMM1PJOUFS&YDFQUJPOQSPD TU\ JG

    TUWBMVFT DPOUBJOT OVMM \ UISPXOFX/VMM1PJOUFS&YDFQUJPO  ^  SFUVSOTUJOUFSQPMBUF  ^
  9. Processor インタフェースをラムダ式で記述 を扱う JSON 4USJOH5FNQMBUF1SPDFTTPS+40/0CKFDU 3VOUJNF&YDFQUJPOKTPO1SPD TUOFX+40/0CKFDU TUJOUFSQPMBUF  Template

    Processor WBSOBNFl4BLVSBCBzWBSDJUZl5PLZPz WBSKTPOKTPO1SPDzzz \ lOBNFzla\OBNF^z lDJUZzla\DJUZ^z ^ lzz
  10. Custom Template Processor による対応 使用できない文字をエスケープ 4USJOH5FNQMBUF1SPDFTTPS4USJOH 3VOUJNF&YDFQUJPO130$TU\ -JTU4USJOHWBMVFTTUWBMVFT TUSFBN NBQ

    WWUP4USJOH SFQMBDF  aa UP-JTU  SFUVSO4USJOH5FNQMBUFJOUFSQPMBUF TUGSBHNFOUT WBMVFT  ^ 4USJOHOBNF4BLVSBCB03QOBNF4BLVSBCB 4USJOHTRM130$4&-&$5 '30.1FSTPOQ8)&3&QOBNFa\OBNF^ z4&-&$5 '30.1FSTPOQ 8)&3&QOBNF4BLVSBCBa03QOBNFa4BLVSBCBz
  11. Custom Template Processor による対応 使用できない文字があれば例外 4USJOH5FNQMBUF1SPDFTTPS4USJOH *MMFHBM"SHVNFOU&YDFQUJPO130$TU\ TUWBMVFT TUSFBN NBQ

    WWUP4USJOH pMUFS WWDPOUBJOT  pOE'JSTU JG1SFTFOU T\ UISPXOFX*MMFHBM"SHVNFOU&YDFQUJPO 453*MMFHBM5FYUa\T^  ^  SFUVSOTUJOUFSQPMBUF  ^
  12. Custom Template Processor による対応 型による制限 (インスタンス生成時にチェック) SFDPSE1FSTPO 4USJOHOBNF \ ίϯετϥΫλͰ஋νΣοΫ

    ^ 4USJOH5FNQMBUF1SPDFTTPS4USJOH *MMFHBM"SHVNFOU&YDFQUJPO130$TU\ WBSWBMVFTTUWBMVFT TUSFBN NBQ W\ JG WJOTUBODFPG1FSTPO WBSOBNF \ SFUVSOOBNF ^FMTF\ UISPXOFX*MMFHBM"SHVNFOU&YDFQUJPO 453a\WHFU$MBTT ^a\W^  ^^ UP-JTU  SFUVSO4USJOH5FNQMBUFJOUFSQPMBUF TUGSBHNFOUT WBMVFT ^
  13. Custom Template Processor による対応 型による制限 (インスタンス生成時にチェック) 0, WBSQFSTPOOFX1FSTPO 4BLVSBCB 

    4USJOHTRM130$4&-&$5 '30.1FSTPOQ8)&3&QOBNFa\QFSTPO^ /( WBSOBNF4BLVSBCB 4USJOHTRM130$4&-&$5 '30.1FSTPOQ8)&3&QOBNFa\OBNF^
  14. の制限 String Template テンプレート引数 : 文字列リテラル テキストブロック or 453)FMMP a\OBNF^z

    文字列リテラル テキストブロック } テンプレート引数をファイルから読み込みたい 文字列リテラルを持つクラスを動的生成
  15. 動的テンプレート引数作成 道具 Compiler API Class Loader Re ection or MethodHandle

    手順 1. 文字列でクラスのひな型を用意 2. テンプレート引数にする文字列をひな型に埋め込み 3. ひな型をコンパイル 4. コンパイルしたクラスファイルをクラスロード 5. リフレクションもしくは で実行 MethodHandle
  16. 動的テンプレート引数作成 QSJWBUFTUBUJD-JTU FYUFOET+BWB'JMF0CKFDUDSFBUF+BWB'JMF0CKFDUT 4USJOHUFNQMBUF \ +BWBͷιʔεͱͳΔจࣈྻ 4USJOHUFNQ4SD453 QVCMJDDMBTT5FNQMBUF\ QVCMJDTUBUJD4USJOH5FNQMBUFQSPDFTT 4USJOHWBSJBCMF

    \   SFUVSOKBWBMBOH4USJOH5FNQMBUF3"8aaa a\UFNQMBUF^ aaa ^ ^   クラスのひな型とテンプレートの埋め込み จࣈྻΛιʔεͱ͢Δ+BWB'JMF0CKFDUΛੜ੒͢Δ +BWB'JMF0CKFDUpMFPCK OFX4USJOH+BWB'JMF0CKFDU 5FNQMBUF UFNQ4SD  SFUVSO-JTUPG pMFPCK  ^
  17. 動的テンプレート引数作成 ίϯύΠϧ͢ΔϑΝΠϧͷ४උ WBSpMFPCKTDSFBUF+BWB'JMF0CKFDUT UFNQMBUF   ίϯύΠϥͷऔಘ +BWB$PNQJMFSDPNQJMFS5PPM1SPWJEFSHFU4ZTUFN+BWB$PNQJMFS  Ծ૝ϑΝΠϧϚωʔδϟͷऔಘ

    WBSpMF.BOBHFSDPNQJMFSHFU4UBOEBSE'JMF.BOBHFS OVMM OVMM OVMM  ίϯύΠϧλεΫͷੜ੒ +BWB$PNQJMFS$PNQJMBUJPO5BTLUBTLDPNQJMFSHFU5BTL OVMM pMF.BOBHFS OVMM -JTUPG SFMFBTF  FOBCMFQSFWJFX OVMM pMFPCKT  ίϯύΠϧ UBTLDBMM  クラスのコンパイル
  18. 動的テンプレート引数作成 Ϋϥεͷϩʔυ WBSMPBEFS$MBTT-PBEFSHFU4ZTUFN$MBTT-PBEFS  WBSDMTTMPBEFSMPBE$MBTT 5FNQMBUF  .FUIPEΦϒδΣΫτΛऔಘ͠ɺ ϦϑϨΫγϣϯͰ࣮ߦ͢Δ WBSNFUIPEDMTTHFU.FUIPE

    QSPDFTT 4USJOHDMBTT  4USJOH5FNQMBUFEZOBNJD5FNQMBUF  4USJOH5FNQMBUF NFUIPEJOWPLF OVMM OFX0CKFDU<>\WBSJBCMF^  クラスのロードと実行