IIFE/Automatic Java 中的方法?

IIFE/Automatic Method in Java?

我知道在 java 中有一种方法可以自动 运行?。这在 java 脚本中称为 IIFE,但这在 java 中可能吗?

Javascript IIFE:

(function() {
    console.log('Hello!');    
})();

谢谢! (我也很好奇)

Java会自动运行指定class中的"public static void main(String[] args)"方法。

在静态上下文中,您可以使用 static 修饰符定义括号内的代码:

public class MyClass{
    static{
        System.out.println("Running static");
    }
}

在 Objects 的上下文中,您可以在不使用 static 修饰符的情况下以相同的方式包装代码:

public class MyClass{

    {
        System.out.println("Initializing");
    }

}

java 中没有 IIFE。

Java 是静态类型和编译的,而 javascript 是动态类型和解释的。

在java中只有一个程序入口点是方法main,即staticpublic

Groovy (JVM base language) you can use repl 中定义的方法(函数是 java 术语中的方法)可以稍后调用,这可能是最接近 IIFE 的东西。

我自己在寻找这个想法时偶然发现了这个问题。我认为 Java 最接近 JavaScript IIFEs 的是一个抽象实例 class,它唯一的方法,一个 execute 方法,在实例创建期间被重写,然后立即执行在对象实例化之后。您甚至可以获得它的关闭方面。但是,您将无法更改覆盖方法中变量所指的内容。

Java脚本:

let subject = 'World';

(() => {
    console.log(`Hello, ${subject}!`);
})();

Java:

public abstract class Iife {
    public abstract void execute();
}

public class Main {

    public static void main(String[] args) {
        String subject = "World";

        new Iife() {
            @Override
            public void execute() {
                System.out.println("Hello, " + subject + "!");
            }
        }.execute();
    }
}

这是 Java 中的一个 IIFE:

((Function<String, String>) s -> {
    String z = "'" + s + "'";
    return z;
}).apply("aaa");

没有上面其他人说的直接方式

匿名内部Class with init() Initializer

我觉得这可以像 IIFEs 一样使用,但问题是它需要在另一个里面 class

Thread T  = new Thread() {
    private int num;
    Thread init(int num){
        this.num = num;
        return this;
    }
    @Override
    public void run() {
        // computes and outputs the factorial of num
        int res = 1;
        for (int i = 1; i <= num; i++) {
            res *= i;
        }
        System.out.println(res);
    }
}.init(3);

init() 可用于传递参数以用于工作

以下全部打印“Hello world!”

Java脚本:

console.log((function() {
  const x = "Hello world!";
  return x;
})());

Java:

System.out.println(((Supplier<String>) () -> {
  String x = "Hello world!";
  return x;
}).get());

在Java中创建一个辅助函数来推断类型并为您执行函数可能感觉更符合人体工学:

public static <T> T iife(Supplier<? extends T> supplier) {
  return supplier.get();
}
...
System.out.println(iife(() -> {
  String x = "Hello world!";
  return x;
}));

一般来说,您可能要考虑分解函数。但如果函数相对较小,尤其是捕获多个变量,则 IIFE 可能更具可读性。我将 IIFE 比作块表达式(Java 没有)。