可以用非类型化对象实例化Java类构造函数吗?

可以用非类型化对象实例化Java类构造函数吗?,java,class,constructor,Java,Class,Constructor,我来自Javascript背景。我知道在Java中,要实例化一个类,可以提供多个构造函数来设置类变量。但是,您能否为构造函数提供一个非类型化对象来初始化类变量,如下所示: public class Book { String title; String author; public Book(Object data) { this.title = data.title; this.author = data.author; } }

我来自Javascript背景。我知道在Java中,要实例化一个类,可以提供多个构造函数来设置类变量。但是,您能否为构造函数提供一个非类型化对象来初始化类变量,如下所示:

public class Book {
    String title;
    String author;

    public Book(Object data) {
        this.title = data.title;
        this.author = data.author;
    }
}
因此,我可以实例化一个新书实例,如:

Book bookOne = new Book({ title: "Book One", author: "Author One" });

我之所以想这样做,是因为如果一个类在初始化时有10个以上的变量,那么很难通过给出一个10个参数的列表来可靠地实例化一个类。

你可以依靠JSON api,通过指定一个
字符串来实现,而不是指定一个
对象作为参数。
但这不是类型安全的,而且它是强类型Java中的反模式。
注意,当您在JavaScript前端和Java后端之间通信时,当然可以接受Java中的JSON。但通常我们不会直接操作JSON。它在特定类的实例中反序列化,该类的字段表示JSON传输的信息

我之所以想这样做是因为如果一个类 初始化时需要10多个变量,很难 通过给出一个类的列表(比如10个)来可靠地实例化一个类 参数

具有10个参数的类构造函数也不是一个好模式。
但在某些情况下,为一个实例设置10个字段是可以接受的:尤其是当类仅表示一个数据结构时。
在这种情况下,设置对象字段的最佳方法是使用setter或builder

1) 二传道

Book b = new Book();
b.setTitle(...);
b.setAuthor(...);
2) 建筑道路

Book b = new Book.BookBuilder()
                 .withTitle(...)
                 .withAuthor(...)
                 .build();

但是要真正避免使用容易出错的构造函数,因为参数类型可能会放错位置,而且构造调用的可读性也会受到影响。

不,不能这样做<代码>对象
没有
标题
作者
字段。这意味着如果我想在实例化期间设置10个类变量,我必须创建一个包含10个参数的构造函数。这是正确的吗?从技术上讲,您可以,但您必须依靠反射来复制相关字段。这不是您在Java中通常的工作方式。它允许您编写
Book bookOne=new BookBuilder().setTitle(“Book One”).setAuthor(“Author One”).build()
。我喜欢第二个,在这种情况下我通常使用lombok@YCF_L。就个人而言,我不经常使用lombok,因为我喜欢自己编写生成器,但我认为我必须停止:)很好地提到了生成器模式,我想是的@davidxxx您的代码可能就是这样;)@Sorakthun很清楚地注意到,以某种方式为类失败定义setter
builder会影响构建器的意图:所创建对象的一致性(状态、线程安全性)和不变性。