MySQLデータベースとのインタフェース時に、同じタイプのメソッドをいくつか使用して、別のタイプのパラメータを保存またはロードします。現在、私はそれぞれのタイプごとに異なるメソッドを持っています。これらのメソッドを組み合わせて、異なるタイプをサポートするにはどうすればよいですか?以下同じコードで異なるタイプを使用するリファクタリングメソッド
まだ異なるタイプを使用非常に類似している二つの方法の例である:
public static void saveLongArray(Connection con, int playerID, String tableName, String fieldName, long[] array, long[] originalArray) {
try {
for (int i = 0; i < array.length; i++) {
// Check for change before running query
if (array[i] != originalArray[i]) {
if (array[i] != 0 && array[i] != -1) {
PreparedStatement updateQuery = con.prepareStatement("REPLACE INTO `" + tableName + "` (`player_id`, `index`, `" + fieldName + "`) VALUES(?, ?, ?)");
updateQuery.setInt(1, playerID);
updateQuery.setInt(2, i);
updateQuery.setLong(3, array[i]);
updateQuery.execute();
} else {
PreparedStatement deleteQuery = con.prepareStatement("DELETE FROM `" + tableName + "` WHERE `player_id` = ? AND `index` = ?");
deleteQuery.setInt(1, playerID);
deleteQuery.setInt(2, i);
deleteQuery.execute();
}
originalArray[i] = array[i];
}
}
} catch (SQLException ex) {
Logger.getLogger(PlayerSaveHandler.class.getName()).log(Level.SEVERE, "SQL Exception while saving a long array!", ex);
}
}
public static void saveIntArray(Connection con, int playerID, String tableName, String fieldName, int[] array, int[] originalArray) {
try {
for (int i = 0; i < array.length; i++) {
// Check for change before running query
if (array[i] != originalArray[i]) {
if (array[i] != 0 && array[i] != -1) {
PreparedStatement updateQuery = con.prepareStatement("REPLACE INTO `" + tableName + "` (`player_id`, `index`, `" + fieldName + "`) VALUES(?, ?, ?)");
updateQuery.setInt(1, playerID);
updateQuery.setInt(2, i);
updateQuery.setInt(3, array[i]);
updateQuery.execute();
} else {
PreparedStatement deleteQuery = con.prepareStatement("DELETE FROM `" + tableName + "` WHERE `player_id` = ? AND `index` = ?");
deleteQuery.setInt(1, playerID);
deleteQuery.setInt(2, i);
deleteQuery.execute();
}
originalArray[i] = array[i];
}
}
} catch (SQLException ex) {
Logger.getLogger(PlayerSaveHandler.class.getName()).log(Level.SEVERE, "SQL Exception while saving an int array!", ex);
}
}
なお、実施例ではタイプは、両方の数値です。型が完全に異なる場合(intやStringなど)、重複したメソッドを避けるために何ができますか?
私はこのデザインパターンを検討してきましたが、このケースではこれを使用することは考えていませんでした。ありがとうございました! – jSherz
ここで追加するのは、配列はプリミティブの代わりにオブジェクトを保持するので、equals()(例えば '!array [i] .equals(originalArray [i])'または'compareTo()'。また、配列は数値型しか含まれていないと思われるので、Stringの動作は必要なく、type引数はおそらく ''でなければなりません –
jpm
インタフェースの実装をJavaで良いアイデアにしていますか?それは抽象クラスとしてはうまくいかないでしょうか? – flurdy