如果可以保证不变性,那么在构造函数中包含重逻辑是一种好的做法吗



根据我的理解,尽可能使对象不可变是一种很好的做法。这是否意味着在实现不变性的情况下,添加重型构造函数逻辑是首选?我下面有一个例子。

可突变:

public class Database {

private List<String> database;
private String path;

public Database(String path) {
this.path = path;
database = new ArrayList<>();
}
public void parseAndLoad() {
// heavy logic to parse the file and load into the database
}
}

不可变:

public class Database {
private List<String> database;
private String path;

public Database(String path) {
this.path = path;
database = new ArrayList<>();
parseAndLoad(); // load the database in the constructor
}
private void parseAndLoad() {
// heavy logic to parse the file and load into the database
}
}

如果将代码放在静态工厂方法中,那么如何使用它会更有意义。

示例:以下哪一项能更好地帮助程序员阅读和理解代码?

// Using constructor
Database db = new Database("/path/to/Customers.db");
// Using static method
Database db = Database.parseAndLoad("/path/to/Customers.db");

对我来说,第一个看起来可能会创建一个新的数据库,可能会替换现有的数据库文件。第二个明显地表明,它将现有的数据库文件加载到内存中。

所以,这样做:

public class Database {
private String path;
private List<String> database;
public static Database parseAndLoad(String path) {
List<String> database = new ArrayList<>();
// heavy logic to parse the file and load into the database
return new Database(path, database);
}
private Database(String path, List<String> database) { // Notice it's private
this.path = path;
this.database = database;
}
}

如果在加载完成后不需要path字段,您甚至可以删除它。或者保留它,例如,如果save()方法和/或getPath()方法需要的话。

这可能取决于目的。当然,如果您的繁重过程不依赖于时间或使您的方法输出对某些特定请求或方法调用不同的一切。你必须这样做,以防止多次执行相同的过程。正如您在示例中所写的那样,它可能永远不会被调用,这会产生一个错误。

最新更新