Как создать нисходящий конструктор перегрузки в Java - PullRequest
0 голосов
/ 14 марта 2019

В настоящее время я работаю над проектом Android, где я хочу создать объект с динамическим числом параметров.

Объект RequestOperation всегда будет иметь атрибут Type и может быть создан с 0–3 необязательными строковыми атрибутами, которые хранятся в атрибуте ArrayList<String> с именем requestParams.

При написании конструкторов мне пришла в голову следующая идея:

Можно ли создать конструкторы "псевдо-рекурсивные", чтобы метод конструктора, который принимает три строки, добавляет3-й объект к объекту и вызывает конструктор, который принимает две строки.Это добавит 2-й объект к объекту, а затем вызовет конструктор, который принимает одну строку, которая будет делать то же самое, а затем передает объект с заполненным массивом requestParams конструктору, который не принимает строки и просто добавляет Type атрибут.

Это спасло бы ленивого программиста от написания (фактически длинных) конструкторов снова и снова.

Вот как я себе это представлял (сильно упрощенно):

public class RequestOperation {

    public enum Type {
        //enum values and mappings
    }

    private String applicationUrl;
    private ArrayList<String> requestParams = new ArrayList<>();

    public RequestOperation(Type operationType) {
        this.applicationUrl = composeUrl(operationType, requestParams);
    }

    public RequestOperation(Type operationType, String paramFirst) {
        this.requestParams.add(0, paramFirst);
        new RequestOperation(operationType);
}

    public RequestOperation(Type operationType, String paramFirst, String paramSecond) {
        this.requestParams.add(0, paramSecond);
        new RequestOperation(operationType, paramFirst);
    }

    public RequestOperation(Type operationType, String paramFirst, String paramSecond, String paramThird) {
        this.requestParams.add(0, paramThird);
        new RequestOperation(operationType, paramFirst, paramSecond);
    }

При таком подходе я боюсь, что я создам новый объект внутри конструкторов, а параметры будут записаны внеправильные объекты.Есть ли случайно способ передать сам объект в качестве цели следующего вызова конструктора?Если это плохой подход, пожалуйста, дайте мне знать, я все еще учусь, как правильно программировать.

Ответы [ 2 ]

1 голос
/ 14 марта 2019

Вы можете использовать varargs в такой форме, как:

public RequestOperation(Type operationType, String... parameters) {
    for(String param : parameters) {
       requestParams.add(param);
   }
}

Это дает дополнительное преимущество: вы также можете добавить столько параметров запроса, сколько пожелаете.

РЕДАКТИРОВАТЬ: как упомянуто в комментариях PPartisan, еще более сжатый способ будет

public RequestOperation(Type operationType, String... parameters) {
   requestParams = Arrays.asList(parameters);
} 
0 голосов
/ 14 марта 2019

Вероятно, было бы лучше определить статический метод для класса RequestOperation, называемого как newInstance, который принимает в качестве параметров объект Type и List<String>, а затем рекурсивно вызывает себя, пока длина списка не станет равной 0, затем возвращает RequestOperation, созданный с помощью конструктора, который принимает объект Type.

Я бы сказал, что это лучший подход, чем тот, который вы описали, потому что с вашим методом вы создаете новый объект RequestOperation при каждом рекурсивном вызове, я думаю, что это не очень хорошая практика.

Надеюсь, это поможет!

...