Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果构造函数保证了不变性,那么在构造函数中包含重逻辑是否是一种好的做法?_Java_Oop - Fatal编程技术网

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

Java 如果构造函数保证了不变性,那么在构造函数中包含重逻辑是否是一种好的做法?,java,oop,Java,Oop,根据我的理解,尽可能使对象不可变是一种很好的做法。这是否意味着在实现不变性的情况下,最好添加重构造函数逻辑?下面我举一个例子 可变的: public class Database { private List<String> database; private String path; public Database(String path) { this.path = path; database = new ArrayList<>

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

可变的:

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
  }

}
公共类数据库{
私有列表数据库;
私有字符串路径;
公共数据库(字符串路径){
this.path=path;
数据库=新的ArrayList();
}
public void parseAndLoad(){
//解析文件并加载到数据库的繁重逻辑
}
}
不变的:

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
  }

}
公共类数据库{
私有列表数据库;
私有字符串路径;
公共数据库(字符串路径){
this.path=path;
数据库=新的ArrayList();
parseAndLoad();//在构造函数中加载数据库
}
私有void parseAndLoad(){
//解析文件并加载到数据库的繁重逻辑
}
}

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

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

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

//使用构造函数
Database db=新数据库(“/path/to/Customers.db”);
//使用静态方法
Database db=Database.parseAndLoad(“/path/to/Customers.db”);
在我看来,第一个可能会创建一个新的数据库,可能会替换现有的数据库文件。第二种方法显然是将现有数据库文件加载到内存中

因此,请这样做:

公共类数据库{
私有字符串路径;
私有列表数据库;
公共静态数据库parseAndLoad(字符串路径){
列表数据库=新的ArrayList();
//解析文件并加载到数据库的繁重逻辑
返回新数据库(路径、数据库);
}
私有数据库(字符串路径,列表数据库){//注意它是私有的
this.path=path;
this.database=数据库;
}
}
如果加载完成后不需要
path
字段,您甚至可以删除该字段。或者保留它,例如,如果
save()
方法和/或
getPath()
方法需要