Mam kilka metod, które robią to samo jeszcze, po połączeniu się z bazą danych MySQL, zapisz lub załaduj inny typ parametru. Obecnie mam inną metodę dla każdego typu. Jak mogę połączyć te metody, aby obsługiwały różne typy?Metody refaktoryzacji, które używają tego samego kodu, ale różne typy
Poniżej znajduje się przykład z dwóch metod, które są bardzo podobne ale używają różnych typów:
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);
}
}
Uwaga: W tym przykładzie są oba typy numeryczne. W przypadku, gdy typy są całkowicie różne (np. Int i String), co mogę zrobić, aby uniknąć prawie duplikatów metod?
Szukałem tego wzoru, ale nigdy nie pomyślałbym o używaniu go w tym przypadku. Dziękuję Ci! – jSherz
Dodam tylko, że ponieważ tablice będą teraz przenosić obiekty zamiast prymitywów, powinny być porównywane za pomocą 'equals()' (np. '! Tablica [i] .equals (originalArray [i])' lub 'compareTo()'. Wygląda też na to, że tablice zawierają tylko typy liczbowe, więc nie potrzebujemy zachowania dla String, a argumentem typu powinno być '' tylko po to, by być bezpiecznym –
jpm
Czy dodanie implementacji do interfejsów jest dobrym pomysłem w Javie? Czy nie byłoby lepiej jako klasa abstrakcyjna? – flurdy