0

私はJavaで一種のORMを実装しています。親クラスにのみ存在する静的検索メソッドを実行しようとしています。要点を説明しましょう。

public class DB {
  public static Object find (int id) {
    // i want to return anew instance of the calling subclass
  }
}

public class Item extends DB {
  // nothing here
}

public class Test {
  public static void main () {
    Item i = (Item) Item.find(2);
    ...
  }
}

継承されたクラスのどれがそれを呼び出しているかをfindメソッドに知らせる方法がわからないので、適切なインスタンスを返すことができます(そしておそらく適切なコンストラクターを呼び出すことができます)そして継承されたクラスは何でもかまいません、制限はありません。

スタックトレースを試しましたが、テストからDBまでしかトレースされていません。

何か案は?

みんなありがとう!

4

3 に答える 3

2

静的メソッドは継承されないため、これを行うことはできません。この問題への一般的なアプローチ(利用可能な多数のORMソリューションの1つを使用しないは、クラス階層を2つに分割することです。

  • 「エンティティ」(実際のデータを表すクラスなど)
  • および「DAO」(データアクセスオブジェクト)-データの永続性を操作するメソッドを含むクラス。
于 2009-11-20T22:06:15.043 に答える
1

賢明な言葉: 独自の ORM を試して実装するのはおそらく悪い考えです。hibernateのようなプロジェクトは、このタスクを非常に詳細にカバーしているため、独自のプロジェクトを作成する場合は、車輪を再発明して、すでに解決されている問題を解決しようとする可能性があります。

トピックの詳細については、Java での静的メソッドの処理方法が原因でこれを達成できないという点で、ChssPly76 は正しいです。VM は、静的メソッド呼び出しのバイトコードをロードするときに、ルックアップを実行して、メソッドが実際に配置されている場所を見つけます。クラスで見つからないため、Item代わりに呼び出しを にバインドしますDB.find

でも!バイトコードのラングリングで、あなたがしようとしていることを達成できるかもしれません。javap -c例の静的メソッド呼び出しのバイトコードを (を使用して) 表示すると、次のようになります。

invokestatic Method Item.find:(I)Ljava/lang/Object

したがって、呼び出しが に到達DB.findしたら、スタックトレースをたどって呼び出しサイトに戻り、呼び出しサイトでバイトコードを調べて、呼び出しの実際のターゲットを取得できます。とにかく、理論的には、私は実際にこれを見たことがないからです。また、このようなバイトコードのハッキングにも注意してください。

アクティブなレコード パターンを特定し、それを Java で使用したいと考えていることを称賛します。Java に見られるほとんどの DB アクセス パターンよりも理にかなった設計パターンであり、Ruby と PHP の強みの 1 つであることに同意します。

于 2009-11-20T22:48:13.323 に答える
0

IBMdeveloperworksの「 GenericDAO」の記事がお役に立てばと思います。

短い:ジェネリックを賢く使う。

于 2009-11-20T22:06:38.600 に答える