JRubyで、Javaクラスのinitializeメソッドにハマる。

よそ様から提供されたJavaのライブラリ、使い方が超面倒でJavaで組む気が失せた。
そこでJRubyですよと。ところが、

class Hoge {
  public Hoge() {
  }
  public void initialize(String configFilePath) {
   ...
  }
}

みたいなクラスがあってこれをJRubyにimportすると、Rubyクラスのコンストラクタとしての def initialize() に、Java側の initialize() が隠されてしまう。
それでもメゲズに、

obj.send_java :initialize, "c:/config.xml"

みたいな書き方があるに違いない!と思って探したのだけれど、ないみたい。がーん。探し方が足りないんだろうか。


仕方が無い。Java側で

class MyHoge extend Hoge {
  public MyHoge(String configFilePath) {
    super();
    this.initialize(configFilePath);
  }
}

のようなラップクラスを作って回避。


それにしても、このJavaクラスのメソッドは変。

  • コンストラクタが、デフォルトコンストラクタ「しか」ない。
  • initialize()呼び出し必須。これで処理サーバに接続する。
  • 切断メソッドはshutdown()。

initialize()なんて内部事情なメソッド、利用者に呼ばせるな。
どうして、セッションの切断メソッドがshutdown()なんて物騒な名前なんだよ。

普通に

  • コンストラクタの引数で設定ファイルを指定。
  • open/connectで処理サーバに接続。
  • close/disconnectで接続を切る。

とかでいいじゃないか。
どうしてこういう微妙な仕様が沢山の人のチェックをかいくぐって、現場に降りてくるんだ。
ぷんぷん。