使用相同代码但不同类型的java重构方法
我有几种方法可以做同样的事情,当与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)的情况下,我可以做些什么来避免几乎重复的方法
# 1 楼答案
我会用
long[]
而不是int[]
。与使用JDBC的成本相比,内存差异非常小如果需要处理字符串,可以使用对象类型
如果需要一种方法来
long[]
和Object[]
,可以使用Array.getLength()
和Array.get()
方法来访问所有数组类型。 这可能会增加比节省更多的复杂性# 2 楼答案
如果你打破了你的比较功能,把你的方法降到了最细粒度的水平呢?例如:
对于
delete()
也是如此。没有理由将“新”和“原始”值都传递到此函数中,并在内部进行比较。我建议循环遍历数组,比较并根据需要调用update()
或delete()
。为了处理不同的数据类型,我总是在数据库中传递所需数据的String
值