防止从traits创建匿名类,而不使用封闭对象

时间:2015-04-21 14:19:05

标签: scala

假设我有以下特征和对象:

trait NoAnon {
    val i: Int
}

object NoAnon {
    def create = new NoAnon {
        val i = 123
    }
}

我想防止在随播对象之外创建NoAnon的匿名实例。即。只允许此示例中的create执行此操作。我可以将这些包含在另一个对象中,并将该特征设为私有对象来实现此目的:

object Ctx {

    private[Ctx] trait NoAnon {
        val i: Int
    }

    object NoAnon {
        def create = new Ctx.NoAnon {
            val i = 123
        }
    }

}

是否可以在没有封闭对象Ctx的情况下执行此操作?

为了更清楚一点,traits可以模仿私有抽象类构造函数的功能吗?也就是说,以下示例,除了特征。

abstract class NoAnon private[NoAnon] {
    val i: Int
}

object NoAnon {
    def create = new NoAnon {
        val i = 123
    }
}

1 个答案:

答案 0 :(得分:2)

也许您可以使用具有私有构造函数的类并使用您的特征扩展它。您甚至可以在配对对象中嵌套该类:

trait NoAnon extends NoAnon.type#NoAnonCheck { 
    val i: Int
}

object NoAnon {
    class NoAnonCheck private[NoAnon]
    def create = new NoAnon { 
        val i = 1 
    }   
}

然后,如果你尝试过:

new NoAnon { val i = 2 }

你得到:

error: constructor NoAnonCheck in class NoAnonCheck cannot be accessed in <$anon: NoAnonCheck with NoAnon>

但您可以使用NoAnon.create。除了添加这样的东西,我不认为目前在Scala中有一种纯粹的方法。

当然,正如您所知及在评论中提到的,其他选项是使特征对于封闭对象或包的范围是私有的。