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

时间:2017-09-18 12:03:42

标签: java inheritance parameters abstract-class java-7

我有一些测试JavaFX应用程序,代码有很多类似于数据库的部分。 仅举例:

    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd HH:mm"
    let dateAsString = dateFormatter.string(from: datePickerView.date)

    dateFormatter.dateFormat = "yyyy-MM-dd h:mm a"
    let date = dateFormatter.date(from: dateAsString)
    let DateIn12 = dateFormatter.string(from: date!)
    print("12 hour formatted Date:", DateIn12)

所以我想用抽象方法updateDatabaseInfo创建一个抽象类SqlWorkClass。

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();
            }

继承了SqlWorkClass的3个类 - DatabaseInsertClass,DatabaseUpdateClass和DatabaseSelectClass。 但问题是我必须为每个类使用不同的方法updateDatabaseInfo参数。

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

显然我无法做到这一点。那么我该如何解决这个问题呢?也许我应该使用接口或其他东西而不是抽象类?希望你的建议! 附:我使用Java 7。

3 个答案:

答案 0 :(得分:1)

您可以在DatabaseInsertClassDatabaseUpdateClassDatabaseSelectClass的构造函数中传递这些参数。这样您就可以使用没有参数的updateDatabaseInfo() 对于每个操作,您都必须创建一个新的类实例。

答案 1 :(得分:0)

如果您只想一次更新一条记录,可以使用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
     }

}

答案 2 :(得分:0)

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

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;
    }
}

这里的优点是您不必依赖约定来获取参数类型和名称。您可以很好地定义特定类型的输入。

然后你会使用这样的类:

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