java - 何时使用构造函数以及何时传入参数

标签 java design-patterns

我的一般问题是何时将参数传递给构造函数以及何时将其传递给 一个类的方法。 一般来说,对象是“数据”+“作用于数据的方法”。

我有几个选项来设计一个名为 DFS 的类。以下哪个示例套件定义最好?

选项 1:图形在构造函数中传递,源在函数中传递。 Adv:相同的 DFS 对象将被不同的源重用。

public class DFS {
   Graph g;
   public DFS(Graph g) {
     this.g = g;
   }

   public void doDfs(int source) {
     // dfs computation
   }
}

选项 2:具有 2 个参数且无多态性的构造函数 缺点:对于每个新源都需要构造新对象。

public class DFS {
    Graph g;
    int source;   

    public DFS(Graph g, int source) {
      this.g = g;
      this.source = source;
    }

    public void doDfs() {
      // dfs computation
    }
 }

选项 3:重载构造函数 Adv:解决我们所有的用例。 Dis:多态性的成本很高。

public class DFS {
   Graph g;
   int source;   

   public DFS(Graph g) {
     this.g = g;
   }

   public DFS(Graph g, int source) {
     this.g = g;
     this.source = source;
   }

   public void doDfs() {
      doDfs(source);
   }

   public void doDfs(int source) {
     // dfs computation
   }
}

选项 4:无构造函数

public class DFS {

    DFS() { }

    public void doDFS(Graph g, int source) {
      this.g = g;
      this.source = source;
      // dfs computation
    }
 }

最佳答案

当你有一些与类的操作/定义相关的东西时,那么它就意味着作为构造函数传递。这也意味着,我们非常希望将其设置为不可变。例如:

public class DFS {
   final Graph g;
   public DFS(Graph g) {
     this.g = g;
   }

   public void doDfs(int source) {
     // dfs computation
   }
}

在这里您知道DFS类包含多个方法(每个方法都有自己的算法)来查找图gDFS。在这种情况下,您知道 g 是不可变的,并且为每个方法调用传递它会很痛苦,因此最好将其作为构造函数参数。一些优点:

  1. 每个方法调用都没有多余的参数。
  2. 如果您想进行一些内部缓存,您可以这样做。这是因为一切都与已知实体相关:g
  3. 线程安全,无显式锁定。你需要它和 setter 一起使用。

简而言之,当您知道某些内容不会更改类的定义时,请将其作为构造函数参数。具有使用这些实例变量的方法。当您知道某些内容可以更改时,请使用 Setters。

关于java - 何时使用构造函数以及何时传入参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18052069/

相关文章:

Java Stream 在字符或字节数组中未按预期工作

java - 使用 Java 定制的 TicTacToe 游戏板

design-patterns - 类中最重要的方法有术语吗?

c++ - 带有获取/设置方法的封装设计味道

java - 生成棋盘图案的紧凑方法

java - 在另一个数据流中创建新的数据流

java - 关于文件 file = new File(路径)

java - 是什么原因导致 "java.lang.IncompatibleClassChangeError: vtable stub"?

c# - 如何通过实现适配器模式来隔离胖接口(interface)?

javascript - AngularJS 中的 Controller 和模板