著作一覧 |
今日も、ばかげたprivateに出会ってうんざりする。
うんざりしながらもとりあえずばかでっかなメソッドをコピペしてしのごうとするが、変えたいフィールドは1つなのに対してメソッド全体を持ってくると4〜5個所もprivateなフィールドをいじっていて、フィールドのオーバーライドでしのぐのにも手間がかかり過ぎる。
しょうがないので伝家の宝刀を抜くことにした。
.... Field f = FooBar.class.getDeclaredField("prapra"); f.set(this, apropsPrapra);で、IllegalAccessExceptionになって、ああ、忘れてた(FiledクラスのJavadoc見ながら書いていたので基底のAccessibleObjectクラスのメソッドを忘れてた)と、
.... Field f = FooBar.class.getDeclaredField("prapra"); f.setAccessible(true); f.set(this, apropsPrapra);としても、やはり例外を食らう。はて、と見るとIllegalArgumentExceptionで、なんでだろうと不思議に思う。
class Inner { .... protected void setupFields() { .... Field f = FooBar.class.getDeclaredField("prapra"); f.setAccessible(true); f.set(this, apropsPrapra);
と、ビルダクラスをインナークラスとして実装していることに気づく。6インデント位置のメソッドなのだがアウタークラスのメソッドのつもりになっていた。
そういえば、これ書いたやつは2インデントだったっけ、と思いだす。インデント幅は個人の趣味なので、最初にソースコードを書いたやつの専権事項とするルールを作ったが、はじめてインデント幅でだまされるというのを経験した。でもまあしょうがない。
f.set(FooBar.this, apropsPrapra);
として、無事完了。
しかし、private修飾子って、ほんとにただの癌だな。余計な手間をかけさせられた記憶はあるが、役に立った記憶はただの一度たりとも無い。
ジェズイットを見習え |