如何避免使用长构造函数

2022-09-05 00:40:45

我有一个客户端库,在其中我对我的 rest 服务进行 http 远程调用,然后我返回给正在调用我们库的客户,其中包含我从 REST 服务获得的响应以及任何错误(如果有任何环绕对象)。List<DataResponse>DataResponse

public class DataResponse {

    private final String response;
    private final boolean isLink;
    private final TypeOfId idType;
    private final long ctime;
    private final long lmd;
    private final String maskInfo;

    // below are for error stuff
    private final ErrorCode error;
    private final StatusCode status;

    // constructors and getters here

}

这是我的枚举类:ErrorCode

public enum ErrorCode {

    // enum values

    private final int code;
    private final String status;
    private final String description;

    // constructors and getters

}

这是我的枚举类:StatusCode

public enum StatusCode {
    SUCCESS, FAILURE;
}

正如你在我的课堂上看到的,我有很多字段,所以在此基础上,我有一个非常长的构造函数,每次当我制作一个对象时,我都有一条大线。将来我可能会有更多的字段,但现在我只有这些字段。DataResponseDataResponsenew DataResponse(.......)

有没有更好的方法来制作对象,然后从我的库中返回?DataResponseList<DataResponse>


答案 1

不要立即使用生成器模式它不适用于具有大量必填字段的类型。它适用于具有大量可选字段的类型。

生成器的必需属性通过构造函数指定。您不会被迫使用方法定义值,这使得这些值是可选的。

这可能会使您的对象仅被部分构造。为此使用构建器将是对设计的滥用。


话虽如此,您应该分解您的类型。我不确定什么或是什么,或者真的应该代表什么,所以我不能告诉你你应该以哪种方式分解。但我可以告诉你,凝聚力决定了这一点。lmdctimeDataResponse

isLink,并可能分解为一个对象:maskInfoidTypeDataResponseDetails

class DataResponseDetails {
    private boolean isLink;
    private String maskInfo;
    private TypeOfId idType;

    public DataResponseDetails(boolean isLink, String maskInfo, TypeOfId idType) {
        //...
    }
}

现在你可以由以下部分组成:DataResponseDataResponseDetails

class DataResponse {
    private DataResponseDetails details;
    private String response;
    //...

    public DataResponse(DataResponseDetails details, String response, ...) {
        //...
    }
}

觉得你的构造函数仍然需要太多的东西?分解更多!


答案 2

也许您可以识别较小的逻辑字段组,并将它们移动到自己类的对象中。然后,您可以在对象中组合所有这些对象。DataResponse