如何使用私有构造函数和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
}
答案 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
不知道,那么这将是首选的风格。)