public static class hiTry.R<T> extends Object implements Serializable, AutoCloseable, hiField.HasValue
try-with-resourcesで資源管理を行います。
資源クラスのclose()がtryブロックから抜ける時に呼ばれます。
資源インスタンスの初期化はtryの動作ブロックの中で行うことができます。
資源クラスがclose()を持たない場合でも、close()時の手続きを与えることにより資源解放を行うことができます。
   // ブロックの中で初期化
   try(R<BufferedReader> _r=new R<>()){ // ここでは初期化しなくてよい
      //...
      _r.set(hiFile.openTextFileR(fileName)); // ここで初期化
      //...
      }
   catch(Exception _ex){} // ここでclose()が呼ばれる
   // closeを持たないクラスで資源管理
   try(R<myClass> _r=new R<>){ // ここでは初期化しなくてよい
      _r.whenSet(_m   -> _m.start());// set()時に動く手続き
      _r.whenClose(_m -> _m.end());  // close()時に動く手続き
      //..
      _r.set(new myClass());  // <-- ここでstart()を呼ぶ手続きが動く
      //..
      }                       // <-- ここでend()を呼ぶ手続きが動く
   // catchは必須ではない
| コンストラクタと説明 | 
|---|
| R()値の設定されていないオブジェクトを作る. | 
| R(Consumer<T> closing_)クローズ時の処理を設定し、資源管理オブジェクトを作る. | 
| R(Consumer<T> setting_,
 Consumer<T> closing_,
 long option_)セット時の処理、クローズ時の処理を設定し、資源管理オブジェクトを作る. | 
| R(Consumer<T> closing_,
 long option_)クローズ時の処理を設定し、資源管理オブジェクトを作る. | 
| R(T val_)指定値で資源管理オブジェクトを作る. | 
| R(T val_,
 Consumer<T> closing_)指定値でオブジェクトを作る. | 
| R(T val_,
 Consumer<T> setting_,
 Consumer<T> closing_)指定値で資源管理オブジェクトを作る. | 
| R(T val_,
 Consumer<T> setting_,
 Consumer<T> closing_,
 long option_)指定値で資源管理オブジェクトを作る. | 
| 修飾子とタイプ | メソッドと説明 | 
|---|---|
| void | close()try-with-resourcesブロックの最後に呼ばれるclose. | 
| T | detach()既にある値を取り外す(closeされない,手続き設定は残る) | 
| boolean | equals(hiTry.R<T> that)同値比較. | 
| hiTry.R | reset()既にある値を消去する(手続きも含め設定を消去する) | 
| T | set(T val_)既にある値をcloseし、新たな値を設定する. | 
| static void | useRandomAccessFile(String fileName_,
                   String mode_,
                   hiU.BiConsumerEx<String,RandomAccessFile,Exception> func_)RandomAccessファイルをラムダ式で利用. | 
| T | val()値を得る. | 
| void | whenClose(Consumer<T> closing_)close時の手続きを設定する. | 
| void | whenClose(Consumer<T> closing_,
         long option_)close時の手続きを設定する. | 
| void | whenSet(Consumer<T> setting_)セット時の手続きを設定する. | 
public R()
try-with-resourcesに置きリソース管理を行います。
値はset()関数で与えます。
   try(R<MyResource> _r=new R<>){
      //...
      _r.set(new MyResource(someData)); // セットする
      _r.val().doSomeThing();           // 参照する
      }
public R(T val_)
val_ - valueにセットされるpublic R(T val_, Consumer<T> closing_)
val_ - valueにセットされるclosing_ - 終了時の手続きpublic R(T val_, Consumer<T> setting_, Consumer<T> closing_)
val_ - valueにセットされるsetting_ - set時の手続きclosing_ - 終了時の手続きpublic R(T val_, Consumer<T> setting_, Consumer<T> closing_, long option_)
val_ - valueにセットされるsetting_ - set時の手続きclosing_ - 終了時の手続きoption_ - hiU.EVEN_NULLpublic R(Consumer<T> closing_)
closing_ - クローズ時の処理手続き (close前に呼ばれる)public R(Consumer<T> closing_, long option_)
デフォルトでは値がnullの場合は手続きは実行されません。hiU.EVEN_NULLを指定した場合はnullの場合でも手続きが呼ばれます。
closing_ - クローズ時の処理手続き (close前に呼ばれる)option_ - hiU.EVEN_NULLpublic R(Consumer<T> setting_, Consumer<T> closing_, long option_)
デフォルトでは値がnullの場合は手続きは実行されません。hiU.EVEN_NULLを指定した場合はnullの場合でも手続きが呼ばれます。
setting_ - セット時の処理closing_ - クローズ時の処理手続き (close前に実行)option_ - hiU.EVEN_NULLpublic boolean equals(hiTry.R<T> that)
でも 2つのR<T>のvalue同士をそれぞれequals()比較し 値が一致するかどうかを調べます。ともにnullの場合も一致としています。
that - 比較対象public void close()
通常は自動呼出しですが、利用者が明示的に呼び出しても構いません。
利用者の呼び出しと、try-with-resourceの呼び出しで2重呼び出しとなっても、問題はありません。
close時の手続きが設定されている場合、その手続きを実行します
続いて値がCloseableまたはAutoCloseableの場合closeを呼び出します。
値が未設定の場合、あるいは2度め以降の呼び出しでは、、
hiU.EVEN_NULL指定がなければ利用者手続きは実施されません。
hiU.EVEN_NULL指定いかんにかかわらずcloseの呼び出しは行われません。
close インタフェース内 AutoCloseablepublic T val()
public T set(T val_)
close()処理後、新たな値を設定します。
セット時処理が設定されている場合、処理が実施されます。
例えば次のコードでは
public class Test {
   static class MyBufferedReader implements AutoCloseable{
      public BufferedReader br;
      public String         name;
      public MyBufferedReader(String name_){
         System.out.println("open");
         br  = hiFile.openTextFileR(name_);
         name= name_;
         }
      public void close(){
         System.out.println("close");
         try{br.close();}catch(Exception _ex){}
         }
      }
   static hiMultiPrinter ps;
   public static void main(String[] args_){
      hiU.setPrinter(new hiMultiPrinter(System.out,"kekka.txt"));
      try(R<MyBufferedReader> _br=new R<>()){
         _br.whenSet(  br_ -> System.out.println("SET:"+br_.name) );
         _br.whenClose(br_ -> System.out.println("CLOSE:"+br_.name) );
         //
         _br.set(new MyBufferedReader("A.txt"));
         // ... A.txt読み込み処理
         _br.set(new MyBufferedReader("B.txt"));// ここでA.txtのcloseが起こる
         // ... B.txt読み込み処理
         _br.set(new MyBufferedReader("C.txt"));// ここでB.txtのcloseが起こる
         // ... B.txt読み込み処理
         }// ここでC.txtのcloseが起こる
      catch(Exception _ex){
         System.out.println(hiU.str(_ex,hiU.WITH_STACK));
         }// ここでC.txtのcloseが起こる
      }
   }
// 出力
val_ - 設定する値public void whenClose(Consumer<T> closing_)
close時に実行する手続きを設定します。
closing_ - close時に行う手続きpublic void whenClose(Consumer<T> closing_, long option_)
close時に実行する手続きを設定します。
closing_ - close時に行う手続きoption_ - hiU.EVEN_NULL nullでも実行public void whenSet(Consumer<T> setting_)
セット時に実行する手続きを設定します。
setting_ - セット時に行う手続きset(Object)public hiTry.R reset()
public T detach()
public static void useRandomAccessFile(String fileName_, String mode_, hiU.BiConsumerEx<String,RandomAccessFile,Exception> func_)
RandomAccessファイルをオープンし、ラムダ式を適用、クローズします。
次のように使うことができます。
    void foo(String fileName_,RandomeAccesFile file_)throws Exception{
       // ... ファイル読み込み処理
       }
    //...
       R.useRandomAccessFile(fileName_,"r",(_n_,_a_)->foo(_n_,_a_));
fileName_ - ファイル名mode_ - オープンモード r,rw,rws,rwdfunc_ - ラムダ式