有没有办法避免多个代码的情况下进行变异?
这是写在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标准库与导入相结合, if
expression式让我们使这些代码更清晰,而不会使其更难理解:
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; }
或者,如果你甚至静态导入VISIBLE
和GONE
:
something.setOnClickListener { availableReportRecycler.visibility = if (!availableReportRecycler.isActivated) VISIBLE else GONE; }
如果这更可读是一个品味的问题,但这是Kotlin的方式来做到这一点。
我个人会选择两个版本中的最后一个版本,因为它不会造成太长的路线,并且与官方文档中的例子相符:
// As expression val max = if (a > b) a else b