抽象方法中的参数 (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
}
}
您可以在 DatabaseInsertClass
、DatabaseUpdateClass
和 DatabaseSelectClass
的构造函数中传递这些参数。这样你就可以使用不带参数的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));
我有一些测试 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
}
}
您可以在 DatabaseInsertClass
、DatabaseUpdateClass
和 DatabaseSelectClass
的构造函数中传递这些参数。这样你就可以使用不带参数的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));