首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有没有一种简单的方法来链接无效的java setter,而不是返回这个

有没有一种简单的方法来链接无效的java setter,而不是返回这个
EN

Stack Overflow用户
提问于 2013-07-19 00:57:28
回答 3查看 389关注 0票数 0

我有一堆自动生成的java代码,我将在scala中调用它们。目前,所有的对象都是用void setter生成的,而不是返回this,这使得当你需要设置一堆值时(我不会通过初始化所有东西来使用构造函数,因为大约有50个字段)。例如:

代码语言:javascript
运行
复制
val o = new Obj()
o.setA("a")
o.setB("b")
o.setC("c")

如果我能做这样的事情那就太酷了

代码语言:javascript
运行
复制
val o = with(new Obj()) {
  _.setA("a")
  _.setB("b")
  _.setC("c")
}

我不能将andThen与无名函数一起使用,因为它们需要返回对象。我是固守目前的做事方式,还是有一些我没有意识到的魔法。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-07-19 01:38:39

当然,您可以使用tap ( Kestrel combinator),您目前必须自己定义它:

代码语言:javascript
运行
复制
implicit class Tapper[A](val a: A) extends AnyVal {
  def tap[B](f: A => B): A = { f(a); a }
  def taps[B](fs: A => B*): A = { fs.map(_(a)); a }
}

它是这样工作的:

代码语言:javascript
运行
复制
scala> "salmon".taps(
     |       println,
     |       println
     |     )
salmon
salmon
res2: String = salmon

另请注意

代码语言:javascript
运行
复制
val myFavoriteObject = {
  val x = new Obj
  x.setA("a")
}

将允许您使用短名称进行所有设置,同时指定一个更有意义的名称以供长期使用。

票数 5
EN

Stack Overflow用户

发布于 2013-07-19 01:29:07

您可以使用隐式转换器从/到允许链接的包装器类。

类似于:

代码语言:javascript
运行
复制
case class ObjWrapper(o: Obj) {
  def setA(a: String) = { o.setA(a); this }
  def setB(b: String) = { o.setB(b); this }
  def setC(c: String) = { o.setC(c); this }
}
implicit def wrapped2Obj(ow: ObjWrapper): Obj = ow.o

ObjWrapper(myObj).setA("a").setB("b").setC("c")

实际上,您甚至不需要隐式转换器,因为这些方法已在myObj上调用。

票数 1
EN

Stack Overflow用户

发布于 2013-07-19 02:01:06

看看Scalaxy/Beans吧。但是请注意,它使用的是宏,所以它应该被认为是实验性的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17729659

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档