java - <class>::new 如何成为 Runnable?

标签 java android functional-programming

这是一个人为的代码示例,但基于 Android 项目的真实测试场景。它涉及使用类构造函数来确定类的有效性(确保其处于正确的使用状态)。在这种情况下,只需检查类构造函数在返回类的实例之前不会引发异常:

public class MyTestClass {

    private MyTestClass() {
       // Some code which might throw an exception
    }

    public static MyTestClass getInstance() {
       if (tryClassConstructor(MyTestClass::new)) {
          return new MyTestClass();
       }
       return null;
    }

    private static boolean tryClassConstructor(Runnable condition) {
       try {
           condition.run();
       } catch (ArithmeticException ex) {
           return false;
       }
       return true;
    }
}

我知道 getInstance() 正在将构造函数方法引用 (MyTestClass::new) 传递给它的 tryClassConstructor() 方法,但该方法需要......一个 Runnable。那么这是否意味着类默认构造函数默认是可运行的?

最佳答案

您可以在Runnable中执行以下操作:

Runnable r = () -> {
  new MyTestClass();
};

请注意,它不会返回 MyTestClass 的实例:它只是调用构造函数并丢弃该实例。

这就是当您将其用作 RunnableMyTestClass::new 所做的全部事情。

您可以执行此操作,因为 MyTestClass::new与 void 兼容的new MyTestClass() 是一个语句表达式,因此它可以单独作为一条语句。

关于java - <class>::new 如何成为 Runnable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56137050/

相关文章:

java - ICEFaces AJAX 重定向到 404

java - 当我的闹钟触发 onReceive() 时,通知未显示

functional-programming - 如何最好地在嵌套列表中找到元素?

java - 检测 EC2 实例何时关闭(Java SDK)

Java - 将应用程序提交到 Mac Store 时出错(已弃用的 API 用法)

android - 如何获取Android应用程序中的当前经纬度?

android - 调试服务主线程

scala - 以功能方式进行多个 API 调用

java - 如何循环二维数组中的元素以在 "Ruby functional Style"中构造字符串

java - 用 Grails 替换 Java 的权衡是什么?