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_ - ラムダ式