我在这里错过了一些东西。
我有一个包含一些字符串成员和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在现有范围之后不能保持成员的真实状态这一事实?
由于
答案 0 :(得分:2)
您正在validate
中定义名为order和sortField的新变量(范围较窄),而不是将值分配给先前声明的变量 - 从var
中移除order
那里sortField
和var order = Order.withName(orderInput)
Field.validateField(sortInput)
var sortField = Field.withName(sortInput)
分配。
所以:
order = Order.withName(orderInput)
Field.validateField(sortInput)
sortField = Field.withName(sortInput)
应该成为:
{{1}}