Scala:在类的字段上设置约束
在Scala中,如何在类的字段上设置约束? 在一个包中我有我的模型的域,在另一个包中我有dsl来实例化我的模型。 模型的基本形式如下:Scala:在类的字段上设置约束,scala,constraints,field,Scala,Constraints,Field,在Scala中,如何在类的字段上设置约束? 在一个包中我有我的模型的域,在另一个包中我有dsl来实例化我的模型。 模型的基本形式如下: abstract class Element { var name: String var description: String var types : Set[Type] } class SAComponent (var name :String, var description : String, var
abstract class Element {
var name: String
var description: String
var types : Set[Type]
}
class SAComponent (var name :String,
var description : String,
var properties : Set[Property] = Set(),
var types : Set[Type] = Set(),
) extends Component
元素是我的模型的根。
我想对元素的字段设置约束,以便继承元素的名称、描述和类型的每个类都遵守这些约束。
换句话说,我需要为这些字段定义我得到的值。对吗?
我该怎么办
我试过了,但约束条件没有得到尊重:
abstract class Element {
def name: String
def name_= (value: String): Unit = {if (isBadValue(value)throw new IllegalArgumentException
name = value
}
var description : String,
var types : Set[Type] = Set }
class Component (override var name : String, var description: String) extends Element
问题是一些必须遵守约束条件的字段,
在构造函数中,具体类必须初始化为空值。所以“要求”对我来说不是一个好的解决方案。
谢谢大家。摘要:
trait Init {
val name: String
require(!isBadName(name))
def isBadName(name: String) = true
}
创建:
new { val name = "init" } with Init
初始化时的检查不适用于您,因为您需要有状态的对象,这可以通过使用case类来避免。您可能希望使用为案例类自动生成的
copy(field=value)
创建新对象,而不是改变对象的状态
如果您仍然希望使用有状态对象,我想您需要
abstract class Element {
private var _name: String = null
def name_= (value: String) {
require(!isBadValue(value),"Bad Value")
_name = value
}
def name = _name
def isBadValue(value: String): Boolean
}
class Component (initialName : String) extends Element {
name = initialName
def isBadValue(value: String) = value=="name"
}
val c = new Component(null) // works
c.name = "name" // exception
需要指出的另一件事是:代码中的
override var name
生成的setter会覆盖name
方法,您可能已经知道了 嗨,谢谢你的回复。但你的解决方案对我不起作用。我需要的是“var”,而不是val。每次更改值时都必须进行控制,而不仅仅是第一次执行实例时。你有什么建议吗?