Может ли lombok генерировать как конструкторы stati c, так и не stati c? - PullRequest
3 голосов
/ 10 февраля 2020

У меня есть простой dto класс

@Getter
@EqualsAndHashCode
@ToString
@RequiredArgsConstructor(staticName = "of", access = AccessLevel.PUBLIC)
public class MyClass {
    private final String field1;
    private final String field2;
}

Мне нужно иметь оба конструктора static и non-static. Если я деломбок конструкторов

@Getter
@EqualsAndHashCode
@ToString
public class MyClass{
    private final String field1;
    private final String field2;

    private MyClass(String field1, String field2) {
        this.field1= field1;
        this.field2= field2;
    }

    public static MyClass of(String field1, String field2) {
        return new MyClass(field1, field2);
    }
}

Это почти то, что мне нужно, но конструктор non-static это private. Можно ли сделать это public с ломбоком?

1 Ответ

1 голос
/ 10 февраля 2020

Это невозможно в Ломбоке (по крайней мере, в текущей версии 1.18.12). Рассмотрите возможность просмотра JavaDo c здесь . Это говорит о том, что установка свойства staticName пометит конструктор как приватный. В нем не указано явно, что он будет игнорировать свойство access , но на практике это выглядит так.

Обычно считается плохой практикой предоставлять несколько способов достижения одного и того же результата, в в этом случае создается экземпляр класса с теми же параметрами. Учитывая тот факт, что ваш код уже использует оба, вы можете рассмотреть возможность создания методов построения stati c вручную и пометить одну технику как устаревшую, чтобы предотвратить ее использование в будущем до полного ее рефакторинга.

@Getter
@EqualsAndHashCode
@ToString
@AllArgsConstructor(onConstructor=@__(@Deprecated))
public class MyClass {
    private final String field1;
    private final String field2;

    public static MyClass of(String field1, String field2) {
        return new MyClass(field1, field2);
    }
}

или:

@Getter
@EqualsAndHashCode
@ToString
@AllArgsConstructor
public class MyClass {
    private final String field1;
    private final String field2;

    /**
     * @deprecated Will be removed in the future.
     *    Use {@link #MyClass(String, String)} instead 
     */
    @Deprecated
    public static MyClass of(String field1, String field2) {
        return new MyClass(field1, field2);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...