当前位置:  开发笔记 > 编程语言 > 正文

如何避免制作长构造函数

如何解决《如何避免制作长构造函数》经验,为你挑选了1个好方法。

我有一个客户端库,我在其中对我的休息服务进行http远程调用,然后我返回List给调用我们的库的客户,我从REST服务获取响应以及任何错误,如果有任何包装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;
}

正如你在我的DataResponse班级中看到的那样,我有很多字段,所以我有一个非常长的构造函数,每次当我创建一个DataResponse对象时,我都有一个大的new DataResponse(.......).将来我可能会有更多的领域但是现在我只有这些领域.

有没有更好的方法可以用来制作一个DataResponse对象然后List从我的库中返回?



1> Vince Emigh..:

不要立即使用构建器模式.它不适用于包含大量必填字段的类型.它适用于包含大量可选字段的类型.

通过构造函数指定构建器的必需属性.您不必使用方法定义值,这使得这些值是可选的.

这样,您的对象只能部分构建.使用构建器可能会滥用设计.


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

isLink,maskInfoidType可能被分解为一个DataResponseDetails对象:

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

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

现在你DataResponse可以组成DataResponseDetails:

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

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

感觉你的构造函数需要太多了吗?分解更多!

推荐阅读
低调pasta_730
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有