1

この質問にどのようなタイトルを付ければよいか、私は少し確信が持てないので、他の人がそれを使用している可能性がありますが、私は先生からポリモーフィズムのこの簡単な例を持っています。

しかし、私の変更が「安全」かどうかはわかりません。

public class AppSystem {
   ...
   private DataPersistenceInterface DataDAO;
   private DataController DataController;
   ...

   public void createConnection(String username, String password) 
                                throws ClassNotFoundException, SQLException {

      if(username.isEmpty() || password.isEmpty()) {
           DataDAO = new DataDAO();
           DataController = new DataController(DataDAO);
         } else {
           DataDAO = new DataDAO(url, username, password, driver);
           DataController = new DataController(DataDAO);
         }
      }

   public void closeConnection() {
        DataDAO.closeConnection();
   }

コントローラーと DAO があります。DAO は、DataPersistenceInterface と呼ばれるインターフェイスを実装します。このインターフェイスは、データベースとの通信に必要ないくつかのメソッドをホストします。datacontroller はすべてのロジックを処理し、それ以外のことを知りたくないので、インターフェイスの型で DAO の参照を渡します。

これは私の先生がしたことです。ただし、DataDAOへの参照はDAOクラスの「closeConnection」メソッドを指していないため、以下の「closeConnection」メソッドは機能しません...

[上記のコードでは、明らかに closeConnection メソッドは機能しません]

今、私の考えはただ変更することでした...

   private DataPersistenceInterface DataDAO;

   private DataDAO DataDAO;

datacontroller はそのコンストラクターで DataPersistenceInterface の引数を取るため、DAO オブジェクトからそれ以外のことを知ることはありません。これで、DAO で closeConnection を呼び出すことができるようになりました。

しかし、これが「安全」であるかどうかはわかりませんか?何かがそうではないと私に言っているだけです。

お時間をいただきありがとうございます。

4

1 に答える 1

0

まず第一に、コードを明確にするために、書くのではなく

   private DataPersistenceInterface DataDAO;

書きます :

   private DataPersistenceInterface dataPersistenceInterface;

Java プロパティには常にキャメル ケースを使用し、使用しているクラスと同じ名前を使用します。ベスト プラクティスは、実装に、インターフェイスと同じ名前に Impl を加えた名前を付けることです。

DataPersistenceInterfaceImpl

これはパターンの問題です。Dao のコンストラクターを使用して接続を作成する場合は、次の 3 つの選択肢があります。

1) closeConnection メソッドをインターフェイス シグネチャに追加することで、DataPersistenceInterface インターフェイスに追加できます。

public void closeConnection();

2) ただし、AppSystem クラスは DataPersistenceInterface (DataDao) の作成に使用する実装を認識しているため、インターフェイスを実装にキャスト バックできます。closeConnection() が返されます。これは私の最高のゲストでしょう。

   public void closeConnection() {
        ((DataDAO)dataPersistenceInterface).closeConnection();
   }

3) AppSys の使用状況に応じて、接続を閉じる必要はありません。close connection メソッドを DataDAO 実装の finalize() メソッドに入れます。AppSys アプリケーションが終了すると、接続は閉じられます。

protected void finalize() throws Throwable {
try{
connection.close;
}catch(Exception e){
...
}
}

最善の方法は、c3po のような ConnectionPool または Apache ConnectionPool を使用することです。

于 2012-11-25T21:05:26.413 に答える