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_NULL
public R(Consumer<T> closing_)
closing_
- クローズ時の処理手続き (close前に呼ばれる)public R(Consumer<T> closing_, long option_)
デフォルトでは値がnullの場合は手続きは実行されません。hiU.EVEN_NULLを指定した場合はnullの場合でも手続きが呼ばれます。
closing_
- クローズ時の処理手続き (close前に呼ばれる)option_
- hiU.EVEN_NULL
public R(Consumer<T> setting_, Consumer<T> closing_, long option_)
デフォルトでは値がnullの場合は手続きは実行されません。hiU.EVEN_NULLを指定した場合はnullの場合でも手続きが呼ばれます。
setting_
- セット時の処理closing_
- クローズ時の処理手続き (close前に実行)option_
- hiU.EVEN_NULL
public 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
インタフェース内 AutoCloseable
public 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_
- ラムダ式