限制Scala类的构建

时间:2015-09-25 01:41:47

标签: scala

假设:

class Foo(x: Int) {}

object Foo {
  def apply(x: Int) = new Foo(x)
}

除了将Foo的构造函数标记为private之外,如何在调用new Foo(...)时出现警告或编译时失败?

换句话说,我想限制(通过编译时警告或错误)构建FooFoo.apply

这可能吗?

1 个答案:

答案 0 :(得分:7)

在scala中,有两种惯用方法可以实现这一点。

  1. 类和伴随对象的私有构造函数。
  2. 工厂可以访问构造函数,而其他任何人都没有:

    class Foo private[Foo](val x: Int)
    
    object Foo {
      def apply(x:Int) = new Foo(x)
    }
    
    val foo = new Foo(1)  // cannot compile
    val foo1 = Foo(1) //compiles fine
    
    1. 密封抽象类。
    2. 在scala中,sealed类只能在定义的同一源文件中扩展。 我建议您使用Foo sealed abstract class并在对象的申请方法中返回Foo的匿名孩子。

      sealed abstract class Foo(val x:Int)
      
      object Foo {
        def apply(x:Int):Foo = new Foo(x) {}
      }
      

      在这种情况下,Foo可以在任何地方创建,除了定义它的文件。

      UPD :实际上,这个问题已经是discussed on stackoverflow

      UPD2 :添加了两种方法的简要概述。