Как создать x количество параметров в конструкторе java

#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. Форум уже принят