创建实例并将其作为参数传递和在参数内创建实例有什么区别?

What is the difference between creation of instance and passing it as parameters and creation instance inside parameters?

下一条记录之间的主要区别是什么:

Database database = new Database(config);
User user = new User(database);

User user = new User(new Database(config));

我的理解是否正确,第二个只是第一个的缩写形式,可以在我不打算调用任何 database 方法时使用?

对于大多数用途来说,确实没有太大区别。不过有几点不同:

  1. 在第一种情况下,您可以通过 database 变量访问 Database 实例,而在第二种情况下,您必须从 User user 引用的实例,以便直接对其执行任何操作。如果您只是用 Database 构造 User 然后直接不对其进行任何操作,那显然无关紧要。

  2. 如果 user 引用的 User 实例由于某种原因不再引用 Database 对象(例如,它只在其构造函数中使用它,或者其他一些调用将引用它的成员变量设置为 null),并且 database 仍然存在,那么对该 Database 对象的引用仍然存在于程序中, GC 无法收集它。如果您正在为每个对象创建单独的成员变量而不是使用局部变量,或者如果您单独传递对象,并且您不打算访问 Database,那么这主要是一个问题直接,那么为它设置一个单独的成员变量或传递它真的没有意义。

所以,实际上,唯一的区别与单独引用 Database 的后果有关,如果您对 Database 所做的一切都是构建 User,那么拥有一个 database 变量是完全没有必要的。