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中执行以下操作:

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


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

当您将MyTestClass::new用作Runnable时,这就是全部。

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

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

相关文章:

java - 无法从重新确定的响应中获取Json对象(在json中)

android - 重置 View 按下状态

module - Elixir - 'use' 关键字有什么作用?

java - 对ExecutorService中的MongoRepository的调用无法完成

java - 加载 spring xml 抛出 SAXParseException

java - 四舍五入到小数点后一位

android - 使用虚拟框和Genymotion启动虚拟设备时出错

android - RXJava 条件执行 Observables + null 处理

functional-programming - 如何将数据传递到组合管道的后期阶段

java - 删除双向链接列表中的节点时遇到问题