有没有办法避免多个代码的情况下进行变异?

这是写在kotlin,但我敢肯定它在java中几乎相同。

something.setOnClickListener { availableReportRecycler.isActivated = !availableReportRecycler.isActivated if (availableReportRecycler.isActivated) availableReportRecycler.visibility = View.VISIBLE else availableReportRecycler.visibility = View.GONE } 

有没有在kotlin / java的方式来简化这个代码?

我觉得它应该能够减少它像(伪代码):

 something.setOnClickListener { availableReportRecycler.visibility = {availableReportRecycler.isActivated = !self} ? View.VISIBLE:View.GONE } 

我没有find任何相关的在线,但仍然不能得到它的工作后,强暴各种组合强迫。

你可以做得多漂亮吗? 最好的答案是获得一个虚拟的啤酒和“我没事”贴纸!

所提供的代码的主要部分不是很漂亮的是重复长的availableReportRecycler名称。 将范围函数with Kotlin标准库与导入相结合, ifexpression式让我们使这些代码更清晰,而不会使其更难理解:

 something.setOnClickListener { with (availableReportRecycler) { isActivated = !isActivated visibility = if (isActivated) VISIBLE else GONE } } 

你可以像使用其他的范围函数一样避免在第二个语句中重复isActivated ,但是对于我的口味来说,它不会使这个特定的代码更好。

我认为罗马Elizarov有一个很好的方法。 但是,如果你想链接激活和可见性,你可能要考虑覆盖setActivated像这样:

 class AvailableReportRecycler(context: Context) : View(context) { override fun setActivated(value : Boolean) { super.setActivated(value) visibility = if(value) View.VISIBLE else View.GONE } } 

这样您可以将可见性链接到激活的状态。 你可以这样调用它:

 something.setOnClickListener { availableReportRecycler.isActivated = !availableReportRecycler.isActivated } 

不是面向对象美丽? 🙂

在Java中,这可以表示为三元运算符。 Kotlin缺乏这个,因为if它本身就是一个expression式,换句话说它就会返回一个值(参见官方的Kotlin文档 )。

你可以用Kotlin中的if运算符来expression这一点:

 something.setOnClickListener { availableReportRecycler.visibility = if (!availableReportRecycler.isActivated) View.VISIBLE else View.GONE; } 

或者,如果你甚至静态导入VISIBLEGONE

 something.setOnClickListener { availableReportRecycler.visibility = if (!availableReportRecycler.isActivated) VISIBLE else GONE; } 

如果这更可读是一个品味的问题,但这是Kotlin的方式来做到这一点。

我个人会选择两个版本中的最后一个版本,因为它不会造成太长的路线,并且与官方文档中的例子相符:

 // As expression val max = if (a > b) a else b