2017-05-03 2 views
1

私のメソッドの1つのパラメータとして渡すクラスはほとんどありません。クラス変数を渡すとどうすれば得られますか?たとえば、患者クラスを渡したい場合は、患者の名前や電話番号などを知りたいと思います。医者クラスに渡したい場合は、医師の練習や名前などを知りたいそれらの情報をデータベースに入れることができます。私はクラスごとにいくつかのメソッドを作成しようとしていましたが、1つのメソッドを作成して一般クラスに渡す方法があるのだろうかと疑問に思っていました。パラメータの一般クラスを渡す

ここでは一般的な方法のための私の新しいコード/アプローチです:

public boolean addNewUser(Object obj) 
    { 
     boolean success = false; 

     int executedValue = 0; 

     try 
     { 
      Connection conn = DBConnection.getConnection(); 

      String query = "INSERT INTO Users (id, firstName, lastName, email, address, phonenumber, dob) VALUES (?,?,?,?,?,?,?)"; 
      PreparedStatement stmt = conn.prepareStatement(query); 
      stmt.setString(1, obj.getId); // not possible 
     } 
     catch(Exception e) 
     { 
      System.out.println(e); 
     } 

     return success; 
    } 

ここでは私の昔のアプローチは、私がPatientDoctorまたは任意の他の聞かせて、その後、あなたがインターフェイスを作成することをお勧めしたい

public boolean addNewPatient(Patient patient) 
    { 
     boolean success = false; 

     int executedValue = 0; 

     try 
     { 
      Connection conn = DBConnection.getConnection(); 

      String query = "INSERT INTO Users (id, firstName, lastName, email, address, phonenumber, dob) VALUES (?,?,?,?,?,?,?)"; 
      PreparedStatement stmt = conn.prepareStatement(query); 
      stmt.setInt(1,patient.getId()); 
      stmt.setString(2, patient.getFirstName()); 
      etc... 
     } 
     catch(Exception e) 
     { 
      System.out.println(e); 
     } 

     return success; 

    } 
+2

あなたのクラスは、必要なすべての属性の配列を返すgetAttributesメソッドを使ってインターフェイスを実装していることがありますか?いくつかのクラスが機能を共有したいので、これは悪い習慣のようには見えませんが、間違っていれば私を修正してください。 –

+0

リフレクションAPIを使用して、ランタイムにクラスのフィールド名の型などにアクセスできます。https://docs.oracle.com/javase/tutorial/reflect/ – brunesto

+2

これは、インタフェースまたは基本クラスの場合とまったく同じです。 – chrylis

答えて

1

"継承"で行うことができます。あなたのデータベーステーブルは "USERS"という名前でコードを見ているので、患者のユーザと医師のユーザを区別していないようですが、すべて同じテーブルにあるので、親クラスをUserとして作成し、 id,firstName,lastNameなどのようにして、PatientsDoctorのクラスがこの親クラスを拡張します(各サブクラスには、より多くのフィールド/メソッドがあります)。最後に、DAOメソッドはaddUser(User user)になります。たとえば、以下のサンプルクラスを受け入れる場合は、Userオブジェクトです。

public boolean addNewUser(User user) { 
    boolean success = false; 

    int executedValue = 0; 

    try { 
     Connection conn = DBConnection.getConnection(); 

     String query = "INSERT INTO Users (id, firstName, lastName, email, address, phonenumber, dob) VALUES (?,?,?,?,?,?,?)"; 
     PreparedStatement stmt = conn.prepareStatement(query); 
     stmt.setInt(1, user.getId()); 
     stmt.setString(2, user.getFirstName()); 
    } catch (Exception e) { 
     System.out.println(e); 
    } 

    return success; 
} 

さておき、あなたもUserと呼ばれるインターフェイスを作成し、あなたのPatientsDoctorクラスは、このインタフェースを実装させることができますように、このアプローチの利点は、あなたが「をインタフェースするプログラミング」されています、親クラスやインターフェースを持たなければならないかどうかは、アプリケーションの設計やその他の要因に依存しますが、それを決定するのが最善ですが、インターフェースを持つこともオプションです。あなたはそれについてもっと知るためにインターフェイスにGoogleのコード/プログラムをすることができます。

+0

「インターフェイスへのプログラミング」は部分的にJavaの 'interface'に関連しています。抽象基本クラスへのプログラミングは、インタフェースへのプログラミングでもあります。 – chrylis

+0

@chrylisはい、あなたは正しいと思います。 – hagrawal

0

です同じ属性を持つオブジェクトはそれを実装します。

public interface IUser{ 
    int id(); 
    String firstName(); 
    String lastName(); 
    String email(); 
    String address(); 
    int phoneNumber(); 
    String dob(); 
} 

次いでタイプIUserの引数を受け入れるaddNewUser方法を変更します。

ここで、すべてのメソッドをuserオブジェクトからインターフェイス経由で呼び出すことができるはずです。

関連する問題