私はジェネリックで全く経験していませんが、少しコードを設定しました。 私の目標は、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;
}
}
は、おそらく私のアプローチは、私は助け/提案のいずれかの種類のために非常に幸せになる、本当に悪いものです: はここに私のコードです。
ありがとうございました
'switch'の問題点は何ですか?いくつの値を期待していますか? – shmosel
データベース内のすべての単一の列に対して特定のメソッドが存在するため、100以上のケースに容易に拡大する可能性があります。 haskellのような実際のラムダ式は問題を修正しますが、javaに対応するものはありますか?私は、java8の機能インタフェースを持つlambdaを知っていますが、より構文的な砂糖があります。 –
'switch'に' case'を追加するのは、新しいメソッドを作成するのと比較してかなり簡単です。 – shmosel