首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Java中处理多个构造函数的最佳方法

在Java中处理多个构造函数的最佳方法
EN

Stack Overflow用户
提问于 2009-02-24 14:10:23
回答 6查看 219.4K关注 0票数 89

我一直在想,在Java中处理多个构造函数的最好(即最干净/最安全/最有效)的方法是什么?尤其是在一个或多个构造函数中没有指定所有字段时:

public class Book
{

    private String title;
    private String isbn;

    public Book()
    {
      //nothing specified!
    }

    public Book(String title)
    {
      //only title!
    }

    ...     

}

如果没有指定字段,我该怎么办?到目前为止,我一直在类中使用默认值,这样字段永远不会为空,但这是一种“好”的做法吗?

EN

回答 6

Stack Overflow用户

发布于 2009-02-24 14:14:03

一个稍微简化的答案:

public class Book
{
    private final String title;

    public Book(String title)
    {
      this.title = title;
    }

    public Book()
    {
      this("Default Title");
    }

    ...
}
票数 160
EN

Stack Overflow用户

发布于 2009-02-24 14:19:05

考虑使用Builder模式。它允许您在参数上设置默认值,并以清晰简洁的方式进行初始化。例如:

    Book b = new Book.Builder("Catcher in the Rye").Isbn("12345")
       .Weight("5 pounds").build();

编辑:它还消除了对具有不同签名的多个构造器的需要,并且可读性更好。

票数 42
EN

Stack Overflow用户

发布于 2009-02-24 14:36:18

您需要指定什么是类不变式,即对于类的实例始终为真的属性(例如,书的标题永远不会为空,或者狗的大小始终> 0)。

这些不变量应在构造过程中建立,并在对象的生命周期中保留,这意味着方法不应破坏这些不变量。构造函数可以通过强制参数或通过设置默认值来设置这些不变量:

class Book {
    private String title; // not nullable
    private String isbn;  // nullable

    // Here we provide a default value, but we could also skip the 
    // parameterless constructor entirely, to force users of the class to
    // provide a title
    public Book()
    {
        this("Untitled"); 
    }

    public Book(String title) throws IllegalArgumentException
    {
        if (title == null) 
            throw new IllegalArgumentException("Book title can't be null");
        this.title = title;
        // leave isbn without value
    }
    // Constructor with title and isbn
}

然而,这些不变量的选择在很大程度上取决于你正在编写的类,你将如何使用它,等等,所以你的问题没有明确的答案。

票数 23
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/581873

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档