Scala:在类的字段上设置约束

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

在Scala中,如何在类的字段上设置约束? 在一个包中我有我的模型的域,在另一个包中我有dsl来实例化我的模型。 模型的基本形式如下:

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。每次更改值时都必须进行控制,而不仅仅是第一次执行实例时。你有什么建议吗?