有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用相同代码但不同类型的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)的情况下,我可以做些什么来避免几乎重复的方法


共 (2) 个答案

  1. # 1 楼答案

    我会用long[]而不是int[]。与使用JDBC的成本相比,内存差异非常小

    如果需要处理字符串,可以使用对象类型

    public static void saveArray(Connection con, int playerID, String tableName, 
        String fieldName, Object[] array, Object[] originalArray) {
    

    如果需要一种方法来long[]Object[],可以使用Array.getLength()Array.get()方法来访问所有数组类型。 这可能会增加比节省更多的复杂性

  2. # 2 楼答案

    如果你打破了你的比较功能,把你的方法降到了最细粒度的水平呢?例如:

    public static void update(Connection con, int playerID, String tableName, String fieldName, String value) {
        // update query logic here
    }
    

    对于delete()也是如此。没有理由将“新”和“原始”值都传递到此函数中,并在内部进行比较。我建议循环遍历数组,比较并根据需要调用update()delete()。为了处理不同的数据类型,我总是在数据库中传递所需数据的String