京急人身事故続発
呪われているのか? 今日も遅れまくり。で、一本待って、駅から車で送ってもらうつもりで西馬込行きに乗る。途中、泉岳寺でずいぶんと待つなと思ったら、なんかホーム反対にとまっている電車に「西馬込行き」とか書いてある。ギリギリで乗り換え。勝手に行き先変えるなよ〜。危うく羽田空港に連れていかれるところだった。車内ではヘッドホンで音楽聴きながら、FindBugsのディテクタコードを読むのに没頭していたので、車内放送は全く聞こえてなかった。危い危い。
enumのequals()
最新のFindBugsは、共変なequals()がenumにあると警告するんだけど、
public enum Channel {
CHANNEL_A(30), CHANNEL_B(40), CHANNEL_C(50);
private int frequency;
private Channel(int frequency) {
this.frequency = frequency;
}
public boolean equals(Channel c) {
if (c == null) return false;
if (c == this) return true;
return (frequency == c.frequency);
}
// ...
}
H C Eq: タイプセーフenum sample29.Channel で、equals(Channel) を定義しています。 Channel.java:[lines 12-14]行目
「なんで共変メソッドだけ警告なのか。そもそもタイプセーフenumは参照で比較できるんだから、equals()のオーバーライド自体がバグでは? もしかして巷では同値の定数を複数定義なんてことが流行っているのか?」とか考えていたんだけど、普通にオーバーライドはエラーになるのね。
public class Test {
enum A {
A0(0), A1(0);
private int i;
private A(int i) {
this.i = i;
}
@Override public boolean equals(Object o) {
if (o == null) return false;
if (o == this) return true;
if (o.getClass() != A.class) return false;
return i == ((A)o).i;
}
@Override public int hashCode() {
return i;
}
}
}
Test.java:10: Test.A の equals(java.lang.Object) は java.lang.Enum の equals(java.lang.Object) をオーバーライドできません。オーバーライドされたメソッドは final です。
@Override public boolean equals(Object o) {
^
Test.java:17: Test.A の hashCode() は java.lang.Enum の hashCode() をオーバーライドできません。オーバーライドされたメソッドは final です。
@Override public int hashCode() {
そうか。final宣言では、共変メソッドまで防ぐことはできないわけだ。
JSTLのfmt
仕様によると、setLocaleしなければAccept-Languageを見てくれそうなものだが、どうもうまくいかない。で、ソースを追っていくと、どうやら"ja-JP"みたいな設定が来ることを想定しているけど、"ja"しかこなくて、失敗している模様。setLocaleで"ja-JP"を明示的に指定すれば、日本表記になった。って、なんか使いものにならない気がするのだけど。これ。





