带有私有构造函数和scala工厂的类?

时间:2011-02-13 00:19:40

标签: java scala

如何使用私有构造函数和Scala中的静态create方法实现类?

以下是我目前在Java中的表现:

public class Tree {
    private Node root;

    /** Private constructor */
    private Tree() {}

    public static Tree create(List<Data2D> data) {
        Tree tree = new Tree();
        return buildTree(tree, data);//do stuff to build tree
    }

1 个答案:

答案 0 :(得分:9)

您所写内容的直接翻译将如下所示

class Tree private () {
  private var root: Node = null
}
object Tree { 
  def create(data: List[Data2D]) = {
    val tree = new Tree()
    buildTree(tree,data)
    tree
  }
}

但这是解决问题的一种有点非Scalaish的方法,因为你正在创建一个未初始化的树,它可能不安全使用,并将其传递给其他各种方法。相反,更规范的代码将具有丰富(但隐藏)的构造函数:

class Tree private (val root: Node) { }
object Tree {
  def create(data: List[Data2D]) = {
    new Tree( buildNodesFrom(data) )
  }
}

如果有可能以这种方式构建。 (在这种情况下取​​决于Node的结构。如果Node必须引用父树,那么这可能要么不起作用要么更尴尬。如果Node不知道,那么这将是首选的风格。)