2012年07月04日

kommons-lib 0.27に入れる予定の簡単な機能

現在kommons-lib 0.27を時間をかけて準備中です。
やはりteterの精度がよくなく、新規で作り直しているところです。
ただ、あまりにリリース時期が伸びており、また、poi2ccでもリリースして修正すべき不具合もみつかっているために、teterを省略してリリースしようかとも考えているところです。

どうでもよいのですが、どう考えてもやっぱいteterは「チーター」とは呼べないのでスペルを変えてしまいました。。。

さて、今回は少々話が代わり、kommons-lib 0.27に入れる予定の機能のうち、ブログで紹介するのにちょうど簡単なちょいプロみたいなものがあったので、早めに紹介しようと思いました。

本当に大それた機能ではありません。kommons-libを利用していますが、ファイル入力処理を記述すると以下のようになります。ただし、close処理は省略しています。


FileInputStream fis = null;
InputStreamReader isr = null;
BufferedReader br = null;

try {
fis = new FileInputStream("ファイル名");
isr = new InputStreamReader(fis);
br = new BufferedReader(isr);

String text = null;

while ((text = br.readLine()) != null) {
// text処理
}
}....(省略)


ここで私があまり好きではないのが、whileの中の条件です。条件なのですが代入込みです。
この場合であれば、


try {
fis = new FileInputStream("ファイル名");
isr = new InputStreamReader(fis);
br = new BufferedReader(isr);

for (String text = br.readLine(); text != null; text = br.readLine()) {
// text処理
}
}....(省略)

と、for文にまぜてしまえば、continueを利用しても副作用的なミスは起きにくいでしょう。
ですが、これもまだなんだか好みではありません。
できれば、もっと良い感じのロジックがいいなと思いました。
そこで、Holdというクラスを無駄に作成しました。Holdを利用すると以下のようになります。


try {
fis = new FileInputStream("ファイル名");
isr = new InputStreamReader(fis);
br = new BufferedReader(isr);

Hold hold = new Hold();

while (hold.setEscapedNull(br.readLine()) != null) {
String text = hold.get();
// テキスト処理
}
}....(省略)


正直、無駄が増えたようにしか見えませんね。でも、個人的にはこちらのほうが好きです。単に好みの問題です。ただ、ポイントはHoldは拡張可能です。今現在のHoldクラスはカウンタがついています。よって、


try {
fis = new FileInputStream("ファイル名");
isr = new InputStreamReader(fis);
br = new BufferedReader(isr);

String text = null;
int count = 0;

while ((text = br.readLine()) != null) {
count++;
// text処理
System.out.println(count + ":" + text);
}
}....(省略)

なんていうコードはHoldを利用すれば、

try {
fis = new FileInputStream("ファイル名");
isr = new InputStreamReader(fis);
br = new BufferedReader(isr);

Hold<String> hold = new Hold<String>();

while (hold.setEscapedNull(br.readLine()) != null) {
System.out.println(hold.getCount() + ":" + hold.get());
}
}....(省略)

となります。ここまで来るとだいぶすっきりです。

最後にHoldのソースを記載します。参考までにどうぞ。kommons-libに入りますので、kommons-libと同じApache License 2.0となります。


package com.kiruah.kommon.jvalue;

/**
* 値を単純に保持するための仕組みを提供します。
*


* whileやforのループの中で以下の代入文が記述されることがあります。
*


* while ((v = func()) != null) {
* // 処理
* }
*

* これはwhileの中で代入処理と比較処理を同時に実行しています。意味や可読性、記述性の面で優れていますが、
* Kiruahは処理を分割したいため、以下のように記述させます。
*

* v = func();
*
* while (v != null) {
* // 処理
*
* // 次の処理
* v = func();
* }
*

* このように記述させることのメリットはあまりありません。単に好みです。
* ですが、funcの呼び出しが分断されるため、分断されないようにするため本機能を提供しています。
*

* Hold h = new Hold();
*
* while (h.set(func()) != null) {
* T v = h.get(); // そのままh.get()を利用しても良い
* // 処理
* }
*

* このクラスのメリットはありませんので、記述上同じ好みを持つ方が利用されることを想定しています。
*


*
* @param ジェネリクス型
* @since 0.27
* @author Kiruah
*/
public class Hold {

/** 保持する値 */
protected T value = null;

/** カウント */
protected long count = 0;

/**
* デフォルトコンストラクタ
*/
public Hold() {

}

/**
* 初期値を保持するコンストラクタ
*
* @param value 初期値
*/
public Hold(
T value) {

set(value);
}

/**
* 値を保持します。
*
* @param value 保持させたい値
* @return 保持させた値
*/
public T set(
T value) {

this.value = value;
count++;

return value;
}

/**
* 値を保持します。

* 値を保持しますが、不正な値の場合(例えばファイルリードの終わりがnullとなるようなケース)において、
* nullの場合カウント結果を累積させない場合に利用します。これはnullを利用する厳密なカウントアップ処理の
* 場合に有効に利用できます。
*
* @param value 保持させたい値
* @return 保持させた値
*/
public T setEscapedNull(
T value) {

this.value = value;

if (value == null) {
return null;
}

count++;

return value;
}

/**
* 保持させた値を返却します。
*
* @return 保持させた値
*/
public T get() {

return this.value;
}

/**
* カウント値を返却します。
*
* @return カウント結果を返却する
*/
public long getIndex() {

return count;
}
}

posted by Kiruahさん at 01:00| Comment(0) | TrackBack(0) | 日記
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス: [必須入力]

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/56849648
※ブログオーナーが承認したトラックバックのみ表示されます。
※言及リンクのないトラックバックは受信されません。

この記事へのトラックバック