【发布时间】:2015-08-02 10:48:25
【问题描述】:
我知道有一种方法可以在 java 中自动运行?这在 javascript 中称为 IIFE,但在 java 中这可能吗?
Javascript IIFE:
(function() {
console.log('Hello!');
})();
谢谢! (我也只是好奇)
【问题讨论】:
我知道有一种方法可以在 java 中自动运行?这在 javascript 中称为 IIFE,但在 java 中这可能吗?
Javascript IIFE:
(function() {
console.log('Hello!');
})();
谢谢! (我也只是好奇)
【问题讨论】:
这是一个 Java 的 IIFE:
((Function<String, String>) s -> {
String z = "'" + s + "'";
return z;
}).apply("aaa");
【讨论】:
apply, or get, or...)。
在静态上下文中,您可以使用 static 修饰符定义括在括号内的代码:
public class MyClass{
static{
System.out.println("Running static");
}
}
在 Objects 的上下文中,你可以用同样的方式包装代码而不用 static 修饰符:
public class MyClass{
{
System.out.println("Initializing");
}
}
【讨论】:
static 块在类加载时加载(参见 stackoverflow.com/questions/3499214/…),并且实例构造中的另一个非静态块。
Java 会在指定的类中自动运行“public static void main(String[] args)”方法。
【讨论】:
我自己在寻找这个想法时偶然发现了这个问题。我认为 Java 与 JavaScript IIFE 最接近的东西是抽象类的实例,其唯一的方法,即执行方法,在实例创建期间被覆盖,然后在对象实例化后立即执行。你甚至可以得到它的闭包方面。但是,您将无法在被覆盖的方法中更改变量引用的内容。
JavaScript:
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();
}
}
【讨论】:
execute 方法的返回类型以匹配。在上面的示例中,我返回void,因为 IIFE 只是应该运行而不返回任何内容。我可以很容易地制作execute 签名public abstract int execute();。然而,通常 IIFE 的执行只是为了它们的副作用(比如启动一个具有自己范围的程序),而不是为了它们的返回类型。听起来这可能不是您想要的。
没有上面其他人提到的直接方法。
带有 init() 初始化器的匿名内部类
我觉得这可以像 IIFE 一样使用,但问题是它需要在另一个类中
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!”
JavaScript:
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 没有)。
【讨论】:
【讨论】: