【问题标题】:How to write this anonymous method in one line?如何在一行中编写这个匿名方法?
【发布时间】:2013-01-13 19:17:19
【问题描述】:

当我进行方法重载时,我总是会碰到这些。如何在一行中编写第二种方法? View.setText(text) 返回void,但我想在执行setText() 后返回TextView
注意:我知道我可以“用两条语句来写”。问题是如何将其合二为一。

private ViewGroup getExpanableListChild() {
    return (LinearLayout) LayoutInflater.from(this).inflate(
            R.layout.list_checkbox, null);
}

private ViewGroup getExpanableListChild(String text) {
    return ViewUtil.getTextViewFromParent(getExpanableListChild()).setText(
            text);//compile error, can't return void.

}

【问题讨论】:

  • 你不能轻易做到——这两行有什么问题?
  • 没什么大不了的,但是当我想在执行 void 方法后返回一些东西时,我总是碰到这些。
  • 您是否“拥有” ViewUtil、ViewGroup 等的代码?
  • 如果你想在调用 void.. 后返回一些东西。你可以尝试使用方法 clone() 检查文档,它返回对象 - 所以你会得到你想要的 tv = yourtv.clone(); 或类似的 textview 或tv = (TextView)yourtv.clone() 和这些你可以在你的 one line.. 中使用的东西。
  • 但你不能:它是 Java,Java 有你无法避免的语法和语义。除非它是您的代码,否则除了创建实用程序之外,您还能做什么?

标签: java android shortcut anonymous


【解决方案1】:

您可以在这些情况下使用 Builder,但我看不出这种特殊情况的意义。

例如:

return ViewUtil.getTextViewFromParent(getExpanableListChild()) //returns some kind of builder
       .setText(text) // returns builder
       .setColor(someColor) // another example, again returns builder
       .build(); // returns ViewGroup

这与 SDK 中存在的策略相同,其中您有一个 AlertDialog.Builder 构建 AlertDialog

【讨论】:

    【解决方案2】:

    正如其他人所解释的,如果不更改 ViewGroup.setText() 的实现以返回 ViewGroup 并将“文本”设置为您传递的任何内容,您根本无法做到这一点。

    这样做将是一种更具功能性的编程风格。 Java 在设计上并不是一种天然的函数式语言,而 void 方法基本上是函数式风格的对立面——即它们有副作用(在这种情况下,在 ViewGroup 对象上设置“文本”)。

    当调用 void 方法时,有必要进行调用,然后在后续行中对生成的、已修改的对象(在本例中返回它)执行某些操作。这只是命令式编程风格。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-29
      • 2020-07-24
      • 1970-01-01
      • 2018-04-23
      相关资源
      最近更新 更多