昔、Throwableについて本気で考えていた
自分の、Javaにおける例外ポリシーはシンプルなものです。
- 呼び出し元が復帰可能、するべきもの:Exception
- 呼び出し元が復帰する必要がない、すべきでないもの:RuntimeException
- 呼び出し元に復帰するかどうかの判断ができないもの:Error
ここでいう呼び出し元は、例外を投げるメソッドを直接呼び出している部分です。
なんかの本か記事を元にしてた気がするんですが思い出せません…
自分の結論は、「投げる人主体で考えていると堂々めぐりになってしまうので、受ける人主体で考えよう」ということです。だって、例外が発生したら処理は呼び出し元に戻るんですから。
このポリシーからいくとErrorはコンテナやプラットフォームを作らないと投げることがないという結論になるので、当然一度も作ったことはありません。
例外を投げる理由ではなく、例外を投げられた側にどうしてほしいかという観点で考えると、それはそれで面白いのではないでしょうか。
合わせて読みたい:Throwableについて本気出して考えてみた
java.sql.TimeStamp.valueOfの罠 2
[java.sql.TimeStamp(http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/sql/Timestamp.html)のvalueOfメソッドはyyyy-mm-dd hh:mm:ss.fffffffffという形式の文字列を引数に取るはずなのですが、yyyy-m-d hh:mm:ssという形式でもEclipseプラグインから実行したmaven testとJUnitのテストランナーで単体実行した場合は通ってしまいます。
ただし、mvnコマンドで「mvn test」を実行すると何も言わずにErrorになってしまい、かなりハマりました。
ただ、実はミニマムセットで試したわけではないので、別の部分の影響があるのかも知れませんが、valueOfで落ちるのは確かです。
バージョンとか
- apache maven 2.0.9
- JUnit 3.8.1
- Maven Integration for Eclipse 0.0.12
s2restがビルドできない件 2
ちょっと試してみようとチェックアウトしたらビルドできなかったのでメモ。
- org.restlet.ext.jaxrsのgroupIdは、com.noelios.restletではなくorg.restlet
- org.restlet.ext.jaxrs-1.1-M3のpomでは、jaxrs-apiの1.0を読み込もうとしてるけど、restletのmavenリポジトリには0.9しかない(←おい!)
と、こんな感じでした。
ちなみに、1のgroupIDを直して、restletのバージョンを最新の1.1-M4を指すようにすれば大丈夫でした。M4の方のpomはちゃんとjaxrs-apiの0.9を指してるという罠。
"ポリモーフィズムの例をもうちっと実用的に書いてみた。"を見て俺も書いてみた
http://d.hatena.ne.jp/daisuke-m/20080509/1210337941
こういう問題は、実は大好物なので俺も書いてみたよ!
まず、どうやって使いたいか考えたけど、俺はこんな感じ。
Main.java
public class Main {
public static void main(String[] args) {
Table table = new Table("users");
table.columns.add(new Column("name", "string"));
table.database = Database.MySQL;
System.out.println(table.toSQL());
}
}
Table.toSQLでテーブル生成のSQLがほしいと思った。columnsをpublicにするのはちょっとリスキーすぎるけど、ここでは触れないことにする。あと、columnのタイプもenumにしたいけど我慢する。
で、書いたコードは以下のとおり。Converterの実装クラスとColumnは自明なので省略する。
Table.java
import java.util.ArrayList;
public class Table {
public String name;
public ArrayList<Column> columns = new ArrayList<Column>();
public Database database = Database.GENERIC;
public Table(String name) {
this.name = name;
}
public String toSQL() {
return this.database.converter.convert(this);
}
}
Database.java
public enum Database {
GENERIC(new GenericSQLConverter()),
MySQL(new MySQLConverter()),
PostgreSQL(new PostgreSQLConverter());
public final Converter converter;
private Database(Converter converter) {
this.converter = converter;
}
}
Conveter.java
public interface Converter {
public String convert(Table table);
}
これで、Conveterの実装クラスを書けば、Database.javaに1行追加するだけで使えるようになるね!しかも、IDEでの補完もばっちり!さらにタイプセーフ! 一行も書かないようにするにはDIのお手伝いが必要だから、この辺で我慢しようね!
久しぶりにjava書いたら、enumの書き方をすっかり忘れてたのはtwitterに書いたとおりw
typoのエントリを書くページにはトラックバック先のURLを入れるところがないんだけど、本文に言及すればいいのかな?よくわからんのでTB行ってないかも…
Mavenのデフォルトエンコード問題で感じたこと
こうやって世論というのが形成されていくのか。
Mavenなんてインストールしたことしかないから、かなり空気読めてないんですけど、みんなソースコードをMS932で書いてたりするってことなの?「今は、デフォルトでシステムエンコードを使ってるんだけど、それ変わると困る!」って人はそういうことだよね?ソースをシステムエンコードで書いてると。
かなりありえないと思ってたけど、結構こういう人が多いの?もしソースをUTF-8で書いてたら、pom.xmlには既にその記述があるから困らないよね。
また、何かの制約で文字コードを明示しなくちゃいけないようなプロジェクトやプラットフォームに依存するプロジェクトは、それはそれで各自文字コードを指定しているから困らないはず。(これを書いてないプロジェクトが多いってこと?)
いったい誰が困るのかさっぱりわからないkenchanなので、誰か優しく詳しく教えてください><