有没有办法在变异时避免多个代码实例?

时间:2018-02-10 11:03:03

标签: android kotlin

这是用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
}

在没有找到任何相关的在线工作后,我已经强制使用各种组合,但仍无法使其工作。

你能做多么美好? 最佳答案是获得虚拟啤酒和“我没事”贴纸!

2 个答案:

答案 0 :(得分:5)

所呈现的代码的主要部分远不是漂亮的是重复长availableReportRecycler名称。将Kotlin标准库中的作用域函数with与导入和if表达式相结合,可以使这些代码更加清晰,而不会让它更难理解:

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

您可以应用also等进一步的作用域功能,以避免在第二个语句中重复isActivated,但是,根据我的口味,它不会使这个特定代码更好。

答案 1 :(得分:1)

我认为Roman Elizarov有一个很好的方法。但是如果你想链接激活和可见性 您可能需要考虑覆盖struct Foo { struct namedStruct { int memb1, memb2; }; static namedStruct namedStructObj; struct { int memb1, memb2; } unnamedStructObj; }; Foo::namedStruct Foo::namedStructObj; // The unnamed type doesn't seem to have a type you can write ,如下所示:

setActivated

这样,您可以将可见性链接到已激活的状态。你可以这样称呼它:

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

不是面向对象的美丽吗? :)