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

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

杨骁
2023-03-14
问题内容

以下是两种方法:

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

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

缺点:如果我有很多属性,则实例化行可能会变得很长,并且可能跨越两行或更多行

  • setter和默认的空构造函数

优点:我可以清楚地看到自己的设置,因此,如果我做错了什么,我可以在键入时立即查明它(我不会因为切换两个相同类型的变量而犯错误)

缺点:具有很多属性的对象的实例化可能需要几行(不知道这是否真的是缺点),如果我忘记设置一个属性,编译器将什么也没说。

你会做什么,为什么?您是否知道有任何灯光图案(考虑到每次实例化具有7个或7个以上属性的对象时都应使用该灯光图案)来建议?我之所以这样问,是因为我倾向于不喜欢大型构造函数,因为在这些构造函数中我无法快速找出要查找的变量在哪里,另一方面,我发现“设置所有属性”容易丢失某些属性。

可以随意讨论我的假设,因为它们只是我的想法:)

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


问题答案:

您可能会看到Joshua Bloch提倡的Builder模式,并在 Effective Java中进行了
描述。http://developers.sun.com/learning/javaoneonline/2007/pdf/TS-2689.pdf上有要点介绍。毫无疑问,您可以找到更好的参考。

基本上,您还有另一个类,可能是一个内部类,该类提供以设置的属性命名的方法,并返回原始生成器,以便您可以链接调用。它使得代码可读性很强。

例如,假设我有一个Message带有一些属性的简单对象。构造此html" target="_blank">代码的客户端代码可以使用构建器来准备a Message,如下所示:

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

的一个片段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;
    }

}


 类似资料:
  • 问题内容: 我不想为我的班级创建默认的构造函数。 但是Spring似乎坚持: 这真的有必要吗? 问题答案: 你是如何定义bean的?听起来你可能已经告诉Spring实例化你的bean,例如以下之一: 没有提供构造函数参数的地方。前一个将使用默认(或不使用arg)构造函数。如果要使用接受参数的构造函数,则需要使用如下元素来指定它们: 如果你想在你的应用程序上下文引用另一个bean中,你可以使用它做的

  • 无论我用什么方法尝试,无论是主构造函数还是次构造函数,我都不知道如何在kotlin中声明一个带有超类和构造函数的新类。 这是我最想做的,但它给出了一个错误,期望成员声明。 这是我认为主要构造函数的外观,但它给出了相同的错误。在Internet上搜索没有帮助,我只能找到第二个示例。 那么,用一个超类和它的一个构造函数创建一个类的所有有效方法是什么呢?

  • 问题内容: 如果父类中有带参数的构造函数,为什么需要默认构造函数(显式) 这将是一个错误。 问题答案: 这里有两个方面的工作: 如果 确实 明确指定了构造函数(如中所述),则Java编译器将 不会 为您创建无参数构造函数。 如果您未明确指定构造函数(如所示),则Java编译器将为您创建一个无参数的构造函数,如下所示: (可访问性取决于类本身的可访问性。) 试图调用超类无参数构造函数-因此它必须存在

  • 问题内容: 警告#1:实际上这是一个潜在的两部分:首先,私有内部类的构造函数是否具有形式参数?如果是,为什么JLS拒绝呢?如果没有,怎么/为什么不呢? 注意事项2: 此问题不用于推测。 我仅在寻找 权威 答案。 默认构造函数在JLS 8.8.9 中定义,该声明(部分说明): 除了在 非私有 内部成员类中之外,默认构造函数没有形式参数,在默认情况下,默认构造函数隐式声明一个表示该类的立即封闭实例的形

  • 问题内容: 在春季,bean的类可能没有公共构造函数,而只有私有构造函数吗?创建bean时会调用此私有构造函数吗?谢谢。 问题答案: 是的,Spring可以调用私有构造函数。如果找到具有正确参数的构造函数,无论可见性如何,它将使用反射将其构造函数设置为可访问的。

  • 问题内容: 我正在尝试使用Jackson来向Json读/写我的POJO。截至目前,我已经为我的班级进行了配置和工作,但第3方班级除外。尝试读取Json时出现错误: 在Google进行几次快速搜索后,看来我的课程需要默认的构造函数或使用注释覆盖默认的构造函数。不幸的是,失败的类来自第3方库,该类没有默认的构造函数,我显然不能覆盖代码。 所以我的问题是,对此我能做些什么吗?还是我不走运? 谢谢。 问题