【问题标题】:IIFE/Automatic Method in Java?Java中的IIFE /自动方法?
【发布时间】:2015-08-02 10:48:25
【问题描述】:

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

Javascript IIFE:

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

谢谢! (我也只是好奇)

【问题讨论】:

    标签: java function methods


    【解决方案1】:

    这是一个 Java 的 IIFE:

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

    【讨论】:

    • 它确实有效。这里的关键成分是定义 lambda 接口的强制转换,没有它,我们将不知道如何调用 lambda (apply, or get, or...)。
    【解决方案2】:

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

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

    在 Objects 的上下文中,你可以用同样的方式包装代码而不用 static 修饰符:

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

    【讨论】:

    • 谢谢你。我还假设您可以在这些“方法”中运行几乎任何代码,对吧?
    • 它依赖于上下文,但可访问的代码可以放在这些块中注意这不等同于 IIFE,static 块在类加载时加载(参见 stackoverflow.com/questions/3499214/…),并且实例构造中的另一个非静态块。
    【解决方案3】:

    Java 会在指定的类中自动运行“public static void main(String[] args)”方法。

    【讨论】:

      【解决方案4】:

      我自己在寻找这个想法时偶然发现了这个问题。我认为 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();
          }
      }
      

      【讨论】:

      • 如何制作一个返回字符串、int、boolean 等变量的变量?
      • 要创建一个返回 String、int、boolean 等的“Java IIFE”,您需要更改 execute 方法的返回类型以匹配。在上面的示例中,我返回void,因为 IIFE 只是应该运行而不返回任何内容。我可以很容易地制作execute 签名public abstract int execute();。然而,通常 IIFE 的执行只是为了它们的副作用(比如启动一个具有自己范围的程序),而不是为了它们的返回类型。听起来这可能不是您想要的。
      【解决方案5】:

      没有上面其他人提到的直接方法。

      带有 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() 可用于传递参数以用于工作

      【讨论】:

        【解决方案6】:

        以下所有内容都打印“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 没有)。

        【讨论】:

          【解决方案7】:

          java 中没有 IIFE。

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

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

          Groovy(JVM 基础语言)中,您可以使用repl,其中定义的方法(函数是 java 术语中的方法)可以稍后调用,这可能是最接近 IIFE 的方法。

          【讨论】:

          猜你喜欢
          • 2021-07-18
          • 1970-01-01
          • 2013-03-03
          • 2020-12-20
          • 2013-01-15
          • 1970-01-01
          • 2012-03-02
          • 2011-12-12
          • 1970-01-01
          相关资源
          最近更新 更多