当前位置: 首页 > 面试题库 >

如何避免使用冗长的构造函数

戚学文
2023-03-14
问题内容

我有一个客户端库,在该客户端库中List<DataResponse>对我的REST服务进行http远程调用,然后返回给客户,该客户正在调用我的库,其中包含从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<DataResponse>从库中返回?


问题答案:

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

构造器的必需属性是通过构造器指定的。您不必强制使用方法定义值,这些方法使这些值成为可选的。

这为您的对象仅部分构建留下了潜力 。为此使用构建器会滥用设计。

这么说,您应该分解您的类型。我不确定应该代表什么,什么lmdctime什么DataResponse,所以我无法告诉您应该以哪种方式分解。但是我可以告诉你,凝聚力是决定这种情况的因素。

isLinkmaskInfo并且idType有可能分解为一个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, ...) {
        //...
    }
}

觉得您的构造函数仍然需要太多空间?分解更多!



 类似资料:
  • 我有以下课程: 该类包含两个可选值,我想提供所有可能的构造函数排列。第一个版本不初始化任何内容,第二个版本只初始化第一个值,第三个版本只初始化第二个值。 最后一个构造函数是第二个和第三个构造函数的组合。但这是不可能写下来的,因为代码失败了。 是否可以在没有任何代码冗余的情况下(也不调用相同的setter方法)编写最后一个构造函数?

  • 自从spring宣布不推荐使用字段注入后,我开始在我的项目中使用构造函数注入。实际上,代码感觉更漂亮,更严格,我可以接受。但我遇到了一个模式,对我来说有点...怪异和冗长: 我有一个抽象的服务bean类(带有注释),它有2个依赖项,直接注入到构造函数中: 然后,我有多个服务bean类(仍然使用注释)扩展抽象服务。我不知道是否还有其他方法,但我发现在每个子类构造函数中注入父级的依赖关系有点冗长和重复

  • 问题内容: 我发现我的构造函数开始看起来像这样: 不断增加的参数列表。由于“容器”是我的依赖项注入容器,所以为什么我不能这样做: 每堂课?不利之处是什么?如果执行此操作,则感觉就像我在使用精美的静态方法。请分享你对IoC和依赖注入疯狂的想法。 问题答案: 正确的是,如果将容器用作服务定位器,则它或多或少是光荣的静态工厂。由于种种原因,我认为这是一种反模式。 构造函数注入的奇妙好处之一是,它使违反单

  • 我不清楚它写在哪里 私有构造函数的存在是为了避免将复制构造函数实现为此(p.x,p.y)时出现的争用条件;这是私有构造函数捕获习惯用法的一个例子(Bloch和Gafter,2005)。 我知道它提供了一个getter来在数组中同时检索x和y,而不是为每一个单独的getter,所以调用者将看到一致的值,但为什么是私有构造函数呢?这里有什么诀窍

  • 问题内容: 我有一个特殊的问题,但我将使示例更一般。我有一个带有强制构造函数参数的 Parent 类和一些可选的参数,每个参数都有一个默认值。然后,我从中继承 Child 并添加一个必需参数,并从 Child 继承 GrandChild 并将另一个必需参数添加到构造函数。结果类似于此: 问题是,这看起来很难看,尤其是如果我想从Child继承更多的类时,我将不得不复制/粘贴该新类的构造函数中的所有参

  • Lodash castArray函数没有任何特殊之处。有没有什么方法可以在没有任何外部库的情况下,利用最新的语言功能解决这个问题,但时间很短? 如果您不熟悉该任务: 有没有办法在没有类型检查的情况下做到这一点?请注意,我寻找最短的等效物ES6。