#java #sql #generics
#java #sql #общие сведения
Вопрос:
Кто-нибудь, пожалуйста, покажите мне, как создать универсальный класс, который создает экземпляр и позволяет устанавливать и возвращать значения позже. Прямо сейчас у меня есть приведенный ниже код, но, как вы можете заметить, он очень запутанный, и я бы хотел, чтобы в нем было x количество параметров из любого числа. Есть ли короткий путь к этому? Есть ли способ, которым я могу использовать HashMaps / HashTables / TreeMaps / etc. для этого?
Причина, по которой я хочу это сделать, состоит в том, чтобы взять таблицу из SQL (много разных таблиц) и сохранить их в общем классе, а затем в HashMap для хранения каждой строки таблицы. Затем мне нужны отдельные хэш-карты для каждой таблицы.
public class Data {
String data1, data2, data3, data4, data5, data6, data7, data8, data9;
public Data(String data1) {
this.data1 = data1;
}
public Data(String data1, String data2) {
this.data1 = data1;
this.data2 = data2;
}
//Continue this process until there is a new constructor for every added parameter
public Data(String data1, String data2, String data3, String data4, String data5, String data6, String data7, String data8, String data9) {
this.data1 = data1;
this.data2 = data2;
this.data3 = data3;
this.data4 = data4;
this.data5 = data5;
this.data6 = data6;
this.data7 = data7;
this.data8 = data8;
this.data9 = data9;
}
//Repeat the next two lines for every variable in class
public void setData1(String data1) {this.data1 = data1;}
public String getData1(String data1) {return data1;}
}
Ответ №1:
Как описано здесь https://docs.oracle.com/javase/tutorial/java/javaOO/arguments.html#varargs вы можете использовать «Произвольное количество аргументов».
Ie:
public class Data {
public Data(String... strings) {
int numberOfStrings = strings.length;
// String data1 = strings[0]; // first arg
}
}
new Data(); // no parameter
new Data(new String[]{"data1"}); // one parameter
new Data("data1"); // one parameter
new Data(new String[]{"data1", "data2", "data3"});
new Data("data1", "data2", "data3");
Комментарии:
1. Ваш пример не имел для меня особого смысла, но я все равно приму его, потому что теперь я знаю, что искать и узнать больше. Спасибо
Ответ №2:
Хотя я не слишком уверен в части SQL вопроса, в целом шаблон проектирования Builder — отличный способ поэтапного построения класса, а не перегруженных конструкторов, особенно если вы планируете иметь конструкторы с большим количеством аргументов.
Чтобы использовать его, мы создали бы другой класс builder, который можно использовать при построении нашего объекта по параметру по параметру. Так, например, для класса данных в вопросе мы могли бы написать:
public class DataBuilder {
// give them some default value in case they aren't initialized by the user
private String data1 = "";
private String data2 = "";
private String data3 = "";
private String data4 = "";
private String data5 = "";
private String data6 = "";
private String data7 = "";
private String data8 = "";
private String data9 = "";
public DataBuilder() {
return new DataBuilder();
}
// returns a reference to itself to allow for chaining
public DataBuilder data1(String data1) {
this.data1 = data1;
return this;
}
public DataBuilder data2(String data2) {
this.data2 = data2;
return this;
}
// and so on for all of the fields
// a method to finally build the Data object from the DataBuilder
public Data build() {
return Data(data1, data2, data3, data4, data5, data6, data7, data8, data9);
}
}
// build in one step with chaining
Data data = new DataBuilder().data1("data1").data2("data2").build();
// build in multiple steps
DataBuilder builder = new DataBuilder();
builder.data1("data1");
builder.data2("data2");
Data data = builder.build();
Комментарии:
1. Спасибо за ваш ответ, но я хочу, чтобы конструктор передавал любое количество параметров, даже больше 9. Форум уже принят