Lombok的Builder可以处理可能抛出异常的构造函数吗?

3
以下代码无法编译。
@Builder
public class ExampleClass {
    private final String field1;
    private final int field2;

    private ExampleClass (String field1, int field2) throws JAXBException {
        // all args constructor that might throw an exception
    }
}

因为java: unreported exception javax.xml.bind.JAXBException in default constructor

这个问题的原因可能是build()方法没有声明它可能会抛出构造函数可能抛出的已检查异常。

有没有一种方法可以让Lombok在不显式实现build()方法的情况下声明这个异常?

@Builder
public class ExampleClass {
    private final String field1;
    private final int field2;

    private ExampleClass(String field1, int field2) throws JAXBException {
        // all args constructor that might throw an exception
    }

    /**
     * I don't want to explicitly declare this
     */
    public static class ExampleClass Builder {
        public ExampleClass build() throws JAXBException {
            return new ExampleClass(field1, field2);
        }
    }
}

为什么不在构造函数中用try catch包装代码? - Dishonered
我不想将构造函数代码包装起来,以便它抛出未经检查的异常,因为我认为当它抛出适当的已检查异常时,这是更清晰的合同。 - neXus
1个回答

4

来自文档:

只有在您没有编写显式构造函数时才能使用此功能。如果您已经有一个显式构造函数,请将@Builder注释放在构造函数上,而不是类上。

@Builder注释移到构造函数上即可:

public class Foo {
    private final String field1;
    private final int field2;

    @Builder
    private Foo(String field1, int field2) throws JAXBException
    {
        this.field1 = field1;
        this.field2 = field2;
        throw new JAXBException("a");
    }
}

根据文档


我确实尝试过,但不小心保留了类级别的注释,导致出现了相同的错误。只在构造函数上放置@Builder注释时,您的解决方案有效。 - neXus
只有当抛出的异常是未检查/运行时类型时,我才认为。 - jAckOdE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接