加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

是否可以在scala中强制命名参数?

发布时间:2020-12-16 09:51:45 所属栏目:安全 来源:网络整理
导读:在某些方法中,我想强制命名参数.原因是自动生成的代码,其参数的顺序未指定(并将保持这种方式). 我能得到的最接近的是 private val _forceNamed: Object = new Object()def doSomething(forceNamed: Object = _forceNamed,arg1: String,arg2: String,...): Un
在某些方法中,我想强制命名参数.原因是自动生成的代码,其参数的顺序未指定(并将保持这种方式).

我能得到的最接近的是

private val _forceNamed: Object = new Object()

def doSomething(forceNamed: Object = _forceNamed,arg1: String,arg2: String,...): Unit = {
  if (forceNamed != _forceNamed) {
    throw Exception(something)
  }

  // actually do stuff
}

但是这只会在运行时失败,而在编译时失败的东西会更好.

解决方法

如果要关闭能够传入null的漏洞,可以使用值类作为防护.

scala> :paste
// Entering paste mode (ctrl-D to finish)

class Foo {
   import Foo._
   def foo(x: Bar = bar,a: String,b: String) = println(a + b)
}

object Foo {
  private[Foo] class Bar(val i: Int) extends AnyVal
  private val bar = new Bar(42)
}

// Exiting paste mode,now interpreting.

defined class Foo
defined object Foo

scala> val f = new Foo
f: Foo = Foo@4a4f9c58

scala> f.foo(null,"","")
<console>:13: error: type mismatch;
 found   : Null(null)
 required: Foo.Bar
       f.foo(null,"")
             ^

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读