【问题标题】:Is there a Java equivalent to if __FILE__ == $0?是否有相当于 if __FILE__ == $0 的 Java?
【发布时间】:2011-04-17 22:00:50
【问题描述】:

我知道在 Python 和 Ruby 中有 sn-ps if __name__ == '__main__': if __FILE__ == $0,只有在直接打开脚本时才会运行。

这似乎是我在 Java(我学校的“官方”编程语言)中没有看到的一个非常有用的功能。 Java中是否有与此等价的东西?如果没有,有什么方法可以实现吗?

【问题讨论】:

    标签: java ruby equivalent


    【解决方案1】:

    java 有public static void main(String[] args) 方法。当一个类从命令行作为主类运行时调用 this,并且通常在这种情况下调用(您可以直接调用它,但通常没有意义)。所以,在java中,标准是把“主调用”逻辑放在这个方法中。

    【讨论】:

    • main 函数不会仅仅通过将类作为库包含在项目中来调用。如果你想为一个库运行main,你必须不遗余力地显式调用它。
    【解决方案2】:

    添加到jthalborn's answer

    真正的问题不是“我如何在 Java 中做到这一点?”它是“为什么 Ruby 和 Python 需要这样的组合?”

    答案是 Ruby 和 Python 期望在文件加载时从头到尾执行文件(作为库或作为主程序),所以你需要一个 hack 说“不要运行这部分如果我被称为图书馆”。 Java 不期望从头到尾运行文件或类。它在特定类中有一个main(),其中包含该类用作主程序时的代码。因此,Java 不需要这种 hack。

    (C和C++在这方面和Java很像,但是你在一个程序中只能有一个main()函数,所以你要么需要求助于使用预处理器来决定编译哪个,要么你需要将不同的main()函数放在不同的文件中,只编译你需要的文件。)

    【讨论】:

    • 我不想对“kludge”/“hack”评论投反对票,但这是错误的。这是一个设计决策,有效地“执行”包含库的库为您提供了有趣的可能性(您知道模块初始化的确切顺序/时刻)。也可以将 Java 的模型称为 hack,因为您必须在编译期间使用可用的 API。不同的方法!= kludge。
    【解决方案3】:

    获取堆栈跟踪并查看第一种方法:

    Throwable t = new Throwable();
    StackTraceElement[] elems = t.getStackTrace();
    ... elems[elems.length-1] should contain a main method ... check if it is yours :) ...
    

    【讨论】:

    • 换句话说,只需在您正在处理的任何文件中的类中添加一个名为main 的静态方法。
    • 这只有在你不启动任何单独的线程时才有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-24
    • 2014-02-02
    • 1970-01-01
    • 1970-01-01
    • 2012-10-23
    相关资源
    最近更新 更多