具有所有类属性的构造函数或带有setter的默认构造函数?

Alb*_*gni 24 java setter constructor

以下是两种方法:

  • 具有所有类属性的构造函数

优点:我必须输入确切数量的参数类型,所以如果我发出错误,编译器会警告我(顺便说一下,有没有办法防止错误地在参数列表上切换两个Integer的问题?)

缺点:如果我有很多属性,那么实例化行可以变得非常长并且可以跨越两行或更多行

  • setter和默认的空构造函数

优点:我可以清楚地看到我正在设置的内容,所以如果我做错了什么我可以在输入时立即查明它(我不能在切换两个相同类型的变量时出现前一个错误)

缺点:具有大量属性的对象的实例化可能需要多行(不知道这是否真的是一个con),如果我忘记设置属性,编译器就不会说任何内容.

你会做什么以及为什么?你知道任何光模式(考虑到应该在每次实例化7个以上的属性时使用它)吗?我问这个是因为我倾向于不喜欢大型构造函数,我无法快速找出我正在寻找的变量的位置,另一方面我发现"set all properties"容易遗漏一些属性.

请随意在优缺点中论证我的假设,因为它们只是我的想法:)

更新 - 我发现的一个与此相关的问题:构建大的不可变对象,而不使用具有长参数列表的构造函数

Jon*_*eet 26

您错过了拥有带有大量参数的构造函数的最大专家:它允许您创建不可变类型.

创建不可变类型而不会产生巨大构造函数的常规方法是使用辅助类型 - 一个构建器,它维护您在最终对象中需要的值,然后在准备好时构建不可变对象.


Rob*_*Rob 20

您可以查看Joshua Bloch倡导的Builder模式,并在Effective Java中进行了描述.http://developers.sun.com/learning/javaoneonline/2007/pdf/TS-2689.pdf上有一些主要内容的演示文稿; 毫无疑问,你可以挖掘出更好的参考.

基本上,你有另一个类,可能是一个内部类,它提供了在设置属性后命名的方法,并返回原始构建器,以便链接调用.它构成了相当可读的代码块.

例如,假设我有一个简单Message的属性.构造它的客户端代码可以使用构建器来准备Message如下:

Message message = new Message.Builder()
    .sender( new User( ... ) )
    .recipient( new User( ... ) )
    .subject( "Hello, world!" )
    .text( messageText )
    .build();
Run Code Online (Sandbox Code Playgroud)

Message.Builder可能看起来类似于以下内容的片段:

public class Builder {

    private User sender = null;
    // Other properties

    public Builder sender( User sender ) {
        this.sender = sender;
        return this;
    }
    // Methods for other properties

    public Message build() {
        Message message = new Message();
        message.setSender( sender );
        // Set the other properties
        return message;
    }

}
Run Code Online (Sandbox Code Playgroud)


Uri*_*Uri 6

最近关于API可用性的学术研究(CMU和Microsoft)表明,使用setter的默认构造函数将是可用性的方法.这来自Jeff Stylos和Steven Clarke撰写的"对象构造函数中需要参数的可用性含义",并在国际软件工程会议上发表:

摘要:API的可用性对程序员的生产力越来越重要.基于对特定API的可用性研究的经验,探索了用于研究许多API共有的设计选择的可用性的技术.进行了一项比较研究,以评估专业程序员如何在对象的构造函数中使用具有必需参数的API,而不是无参数的"默认"构造函数.假设通过引导程序员正确使用对象并防止错误,所需参数将创建更多可用和自我文档化的API.然而,在该研究中,发现与预期相反,程序员强烈倾向于使用不需要构造函数参数的API更有效.使用认知维度框架分析参与者的行为,并揭示所需的构造函数参数干扰共同的学习策略,导致不合需要的过早承诺.