2017-11-17 10 views
1

私はジェネリックで全く経験していませんが、少しコードを設定しました。 私の目標は、dataに対応する正しいメソッドを選択するようにsearchData(ResultSet rs)を実装することです。これは、指定されたclass/databaseFieldの名前です。ジェネリックメソッドを選択する/ Javaのメソッドを推論する

例:

data私はdata = "融資" 私は呼びたいためsearchCustomer(rs)

を呼び出したいdata = "顧客" についてsearchMedium(rs)

を呼び出したい= "中" の場合searchLoan(rs)

これは、これらの方法の多くで巨大になるため、私はそれを実現したくない、またはスイッチケースです。 私はあなたが私の意図を理解し、それを実現する可能性があることを願っています。

public class test3 { 
public static void main(String[] args) { 
    test3 t = new test3(); 
    ArrayList<?> list = t.search("medium"); 
    for (int i = 0; i < list.size(); i++) { 
     System.out.println(list.get(i)); 
    } 
} 

public <T> ArrayList<T> search(String data) { 
    ArrayList<T> resultList = new ArrayList<T>(); 
    Connection c; 
    Statement stmt; 
    String sql = "Error occurred before executing SQL statement"; 
    try { 
     Class.forName("org.sqlite.JDBC"); 
     c = DriverManager.getConnection("jdbc:sqlite:library.sqlite"); 
     c.setAutoCommit(false); 
     stmt = c.createStatement(); 
     sql = "SELECT * FROM " + data + ";"; 
     ResultSet rs = stmt.executeQuery(sql); 

     resultList = searchData(rs, data); 
     rs.close(); 
     stmt.close(); 
     c.close(); 
    } catch (Exception e) { 
     System.err.println(e.getClass().getName() + ": " + e.getMessage() + "\n" + sql + "\nSQL query for " + data 
       + " failed"); 
    } 
    return resultList; 
} 

private <T> ArrayList<T> searchData(ResultSet rs, String data) { 
    ArrayList list = null; 
    // TODO ??? 
    return list; 
} 

private ArrayList<Loan> searchLoan(ResultSet rs) throws SQLException { 
    ArrayList<Loan> resultList = new ArrayList<Loan>(); 
    Loan match; 
    while (rs.next()) { 
     int loanNumber = rs.getInt("NUMBER"); 
     String mediumId = rs.getString("MEDIUMCODE"); 
     int customerNumber = rs.getInt("CUSTOMERNUMBER"); 
     String loanDate = rs.getString("LOANDATE"); 
     String targetReturndate = rs.getString("TARGETRETURNDATE"); 
     String returnDate = rs.getString("RETURNDATE"); 
     int extensions = rs.getInt("EXTENSIONS"); 
     match = new Loan(loanNumber, mediumId, customerNumber, targetReturndate, loanDate, returnDate, extensions); 
     resultList.add(match); 
    } 
    return resultList; 
} 

private ArrayList<Medium> searchMedium(ResultSet rs) throws SQLException { 
    ArrayList<Medium> resultList = new ArrayList<Medium>(); 
    Medium match; 
    while (rs.next()) { 
     String number = String.valueOf(rs.getInt("NUMBER")); 
     String id = rs.getString("ID"); 
     String isbn = rs.getString("ISBN"); 
     String title = rs.getString("TITLE"); 
     String authors = rs.getString("AUTHORS"); 
     String type = rs.getString("TYPE"); 
     String category = rs.getString("CATEGORY"); 
     String publishingYear = String.valueOf(rs.getInt("PUBLISHINGYEAR")); 
     String publishingMonth = rs.getString("PUBLISHINGMONTH"); 
     String timestamp = rs.getString("TIMESTAMP"); 
     String loanerNumber = String.valueOf(rs.getInt("LOANERNUMBER")); 
     match = new Medium(number, id, isbn, title, type, authors, category, publishingYear, publishingMonth, 
       timestamp, loanerNumber); 
     resultList.add(match); 
    } 
    return resultList; 
} 

private ArrayList<Customer> searchCustomer(ResultSet rs) throws SQLException { 
    ArrayList<Customer> resultList = new ArrayList<Customer>(); 
    Customer match; 
    while (rs.next()) { 
     String number = String.valueOf(rs.getInt("NUMBER")); 
     String id = rs.getString("ID"); 
     String lastname = rs.getString("LASTNAME"); 
     String firstname = rs.getString("FIRSTNAME"); 
     String birthdate = rs.getString("BIRTHDATE"); 
     String zipcode = String.valueOf(rs.getInt("ZIPCODE")); 
     String domicile = rs.getString("DOMICILE"); 
     String street = rs.getString("STREET"); 
     String housenumber = String.valueOf(rs.getInt("HOUSENUMBER")); 
     String notification = rs.getString("NOTIFICATION"); 
     String notificationTimestamp = rs.getString("NOTIFICATIONTIMESTAMP"); 
     match = new Customer(number, id, lastname, firstname, birthdate, zipcode, domicile, street, housenumber, 
       notification, notificationTimestamp); 
     resultList.add(match); 
    } 
    return resultList; 
} 

}

は、おそらく私のアプローチは、私は助け/提案のいずれかの種類のために非常に幸せになる、本当に悪いものです: はここに私のコードです。

ありがとうございました

+0

'switch'の問題点は何ですか?いくつの値を期待していますか? – shmosel

+0

データベース内のすべての単一の列に対して特定のメソッドが存在するため、100以上のケースに容易に拡大する可能性があります。 haskellのような実際のラムダ式は問題を修正しますが、javaに対応するものはありますか?私は、java8の機能インタフェースを持つlambdaを知っていますが、より構文的な砂糖があります。 –

+0

'switch'に' case'を追加するのは、新しいメソッドを作成するのと比較してかなり簡単です。 – shmosel

答えて

0

私の理解によれば、ここではGenericsを使ってメソッドを動的に呼び出すことはできません。そのためには、メソッドのオーバーロードを使用する必要があります。ジェネリックスを放棄したい場合は、以下の方法を使用できます。

private RestultSet getResultSet(String tblName){ 
    Connection c; 
    Statement stmt; 
    String sql = "Error occurred before executing SQL statement"; 
    try { 
     Class.forName("org.sqlite.JDBC"); 
     c = DriverManager.getConnection("jdbc:sqlite:library.sqlite"); 
     c.setAutoCommit(false); 
     stmt = c.createStatement(); 
     sql = "SELECT * FROM " + tblName+ ";"; 
     ResultSet rs = stmt.executeQuery(sql); 

     return rs; 
    } catch (Exception e) { 
     System.err.println(e.getClass().getName() + ": " + e.getMessage() + "\n" + sql + "\nSQL query for " + data 
      + " failed"); 
    } 
} 

public ArrayList<Customer> search(Customer c) { 
    ArrayList<Customer> resultList = new ArrayList<>(); 
    ResultSet rs = getRestultSet(c.getSimpleName()); 

    Customer match; 
    while (rs.next()) { 
     String number = String.valueOf(rs.getInt("NUMBER")); 
     String id = rs.getString("ID"); 
     String lastname = rs.getString("LASTNAME"); 
     String firstname = rs.getString("FIRSTNAME"); 
     String birthdate = rs.getString("BIRTHDATE"); 
     String zipcode = String.valueOf(rs.getInt("ZIPCODE")); 
     String domicile = rs.getString("DOMICILE"); 
     String street = rs.getString("STREET"); 
     String housenumber = String.valueOf(rs.getInt("HOUSENUMBER")); 
     String notification = rs.getString("NOTIFICATION"); 
     String notificationTimestamp = rs.getString("NOTIFICATIONTIMESTAMP"); 
     match = new Customer(number, id, lastname, firstname, birthdate,  zipcode, domicile, street, housenumber, 
      notification, notificationTimestamp); 
     resultList.add(match); 
    } 

    rs.close(); 
    return resultList; 
} 

public ArrayList<Medium> search(Medium m) { 
    ArrayList<Medium> resultList = new ArrayList<>(); 
    ResultSet rs = getRestultSet(m.getSimpleName()); 

    Medium match; 
    while (rs.next()) { 
     String number = String.valueOf(rs.getInt("NUMBER")); 
     String id = rs.getString("ID"); 
     String isbn = rs.getString("ISBN"); 
     String title = rs.getString("TITLE"); 
     String authors = rs.getString("AUTHORS"); 
     String type = rs.getString("TYPE"); 
     String category = rs.getString("CATEGORY"); 
     String publishingYear = String.valueOf(rs.getInt("PUBLISHINGYEAR")); 
     String publishingMonth = rs.getString("PUBLISHINGMONTH"); 
     String timestamp = rs.getString("TIMESTAMP"); 
     String loanerNumber = String.valueOf(rs.getInt("LOANERNUMBER")); 
     match = new Medium(number, id, isbn, title, type, authors, category, publishingYear, publishingMonth, 
      timestamp, loanerNumber); 
     resultList.add(match); 
    } 

    rs.close(); 
    return resultList; 
} 

同様に、Loanの検索方法も指定できます。

これは動作します

public static void main(String[] args) { 
    test3 t = new test3(); 
    ArrayList<?> list = t.search(new Medium()); 
    for (int i = 0; i < list.size(); i++) { 
     System.out.println(list.get(i)); 
    } 
} 

希望は次のようにmainメソッドがある...おかげで...

+0

問題が残り、再構成されただけなので、これは機能しません。 さらに、私はt.search(...)に列オブジェクトを挿入するたびにパラメータを見つけなければなりません。これらのオブジェクトはすべてコンストラクタのパラメータとして与えられたデータでビルドされているからです。 –

関連する問題