具有var Enum成员的case类,退出作用域后不保存值

时间:2014-03-26 15:24:12

标签: scala enums scala-2.10

我在这里错过了一些东西。

我有一个包含一些字符串成员和2个枚举的案例类 类构造函数将枚举值作为字符串接收。

我使用命令:

var order = Order.withName(orderInput) //Order is an object that extends Enumeration

为了避免类构造上的异常(如果输入字符串不在枚举值中,我在构造类时将枚举值设置为默认值。

我有一个这个案例类的验证函数,在验证期间我设置枚举,这种情况如果我得到异常,它在验证期间而不是在构造对象时。

代码如下:

枚举代码:

object Order extends Enumeration {
  type OrderType = Value
  val asc = Value("asc")
  val desc = Value("desc")

  def validateOrder(orderInput:String)
  {
      val orderValidate = Order.isOrderType(orderInput)
      if (!orderValidate)
        throw new Exception("Order is invalid ("+orderInput+")!")       
  }
  def isOrderType(s: String) = values.find(_.toString.equals(s)).isDefined
}

我的案例类:

case class ProductsByCategoriesRequest(langaugeInput:String, tenantIdInput:String, categoriesIds:List[String], startInput:Integer, maxResultsInput:Integer,sortInput:String,orderInput: String)
extends ProductSorting 
with Paging
with LanguageFilter
with TenantFilter
 with BaseRequest
{
  var order = Order.asc //default value
  var sortField = Field.name //default value
  val maxResults = maxResultsInput
  val start = startInput
  val language = langaugeInput
  val tenantId = tenantIdInput

  def validate()
  {

    if (StringUtils.isListNullOrEmpty(categoriesIds))
      throw new Exception("Categories Ids list is invalid")    
     validateLanguage
     validateTenant
     Order.validateOrder(orderInput)
     var order = Order.withName(orderInput)
     Field.validateField(sortInput)
     var sortField = Field.withName(sortInput)     
  }
}

有什么奇怪的?在验证期间,枚举被更改,但稍后当我使用此对象并获取枚举的值时,它将始终为" asc"作为默认值。虽然我把它设置为" desc"并看到它改变了!

这可能与scala中的对象行为有关,以及var在现有范围之后不能保持成员的真实状态这一事实?

由于

1 个答案:

答案 0 :(得分:2)

您正在validate中定义名为order和sortField的变量(范围较窄),而不是将值分配给先前声明的变量 - 从var中移除order那里sortFieldvar order = Order.withName(orderInput) Field.validateField(sortInput) var sortField = Field.withName(sortInput) 分配。

所以:

order = Order.withName(orderInput)
Field.validateField(sortInput)
sortField = Field.withName(sortInput) 

应该成为:

{{1}}