抽象方法中的参数 (Java 7)

Parameters in abstract method (Java 7)

我有一些测试 JavaFX 应用程序,代码在数据库方面有很多相似的部分。 举个例子:

Class.forName("com.mysql.jdbc.Driver");
    try (Connection connection = DriverManager.getConnection(Person.getURL(), Person.getDBUSERNAME(), Person.getDBPASSWORD())) {
                String sqlQuery = "INSERT INTO users (users.user_name," +
                        "users.current_balance) VALUES (?, ?)";

                PreparedStatement preparedStatement = connection.prepareStatement(sqlQuery);
                preparedStatement.setString(1, newUserName);
                preparedStatement.setBigDecimal(2, new BigDecimal(newBalance));

                preparedStatement.executeUpdate();
            } catch (SQLException e) {
                e.printStackTrace();
            }

所以我想用抽象方法 updateDatabaseInfo 做一个抽象 class SqlWorkClass。

public abstract class SqlWorkClass {
    public abstract void updateDatabaseInfo() throws ClassNotFoundException;

还有3个class继承自SqlWorkClass——DatabaseInsertClass、DatabaseUpdateClass和DatabaseSelectClass。 但问题是我必须为每个 class.

的方法 updateDatabaseInfo 使用不同的参数
public class DatabaseInsertClass extends SqlWorkClass {

    @Override
    public void updateDatabaseInfo(String newUserName, String newBalance) throws ClassNotFoundException{
            //some actions with code above
}

public class DatabaseUpdateClass extends SqlWorkClass {

    @Override
    public void updateDatabaseInfo(String param1, String param2, String param3) throws ClassNotFoundException{
            //some actions with code above
}

public class DatabaseSelectClass extends SqlWorkClass {

        @Override
        public void updateDatabaseInfo(String param1) throws ClassNotFoundException{
                //some actions with code above
    }

显然我不能这样做。那么我该如何解决这个问题呢?也许我应该使用接口或其他东西而不是抽象 class?希望大家多多指教! p.s。我用 Java 7.

如果您只想一次更新一条记录,您可以使用 HashMap 来存储更新后的值,如下所示:

Map<String, String> data = new HashMap<>();
data.put('id', '112342');
data.put('name', 'CaveJohnson');
data.put('address', 'ApertureSciencesRoad');

然后您的抽象 类 方法将是:

public void updateDatabaseInfo(Map<String, String> updateData) throws ClassNotFoundException;

实现类甚至不需要知道数据头的名称:

public void updateDatabaseInfo(Map<String, String> updateData) throws ClassNotFoundException{
     for(String key:updateData.keys()){
         //Use Prepared Statements to generate a query with `key` being your field 
         //name and `updateData.get(key)` being the value to place in that field
     }

}

您可以在 DatabaseInsertClassDatabaseUpdateClassDatabaseSelectClass 的构造函数中传递这些参数。这样你就可以使用不带参数的updateDatabaseInfo()
对于每个操作,您都必须创建 类.

的新实例

使用参数对象而不是参数列表。您的 super class 定义参数对象 class 并将其用作方法的参数。子 classes 然后实现特定的 classes:

public abstract class SqlWorkClass<I extends Input>
{
    public abstract void updateDatabaseInfo(I input)
        throws ClassNotFoundException;
}
public abstract class Input {}

public class DatabaseInsertClass
    extends SqlWorkClass<InsertInput>
{
    @Override
    public void updateDatabaseInfo(InsertInput input)
        throws ClassNotFoundException
    {
        String param1 = input.newUserName;
        String param2 = input.newBalance;
    }
}
public abstract class InsertInput
    extends Input
{
    public final String newUserName, newBalance;

    public InsertInput(String newUserName, String newBalance)
    {
        this.newUserName = newUserName;
        this.newBalance = newBalance;
    }
}

这里的优点是您不必依赖约定来获得正确的参数类型和名称。您已经很好地定义了特定类型的输入。


然后您将像这样使用您的 classes:

new DatabaseInsertClass().updateDatabaseInfo(new InsertInput(param1, param2));