lombok 可以同时生成静态和非静态构造函数吗?

Can lombok generate both static and non static constructors?

我有一个简单的dtoclass

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

我需要两个构造函数 staticnon-static。如果我 delombok 构造函数

@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。可以用 lombok public 实现吗?

这在 Lombok 中是不可能的(至少在当前的 1.18.12 版本中是不可能的)。 考虑查看 JavaDoc here。它说设置 staticName 属性 会将构造函数标记为私有。它没有明确指定它将忽略 access属性,但实际上它似乎确实如此。

提供多种方法来实现相同结果通常被认为是不好的做法,在本例中创建了一个具有相同参数的 class 实例。 鉴于您的代码已经使用了这两种方法,您可能会考虑手动创建静态构建器方法并将一种技术标记为已弃用,以防止将来使用它,直到完全重构它。

@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);
    }
}