【发布时间】:2011-04-17 22:00:50
【问题描述】:
我知道在 Python 和 Ruby 中有 sn-ps if __name__ == '__main__':
和 if __FILE__ == $0,只有在直接打开脚本时才会运行。
这似乎是我在 Java(我学校的“官方”编程语言)中没有看到的一个非常有用的功能。 Java中是否有与此等价的东西?如果没有,有什么方法可以实现吗?
【问题讨论】:
标签: java ruby equivalent
我知道在 Python 和 Ruby 中有 sn-ps if __name__ == '__main__':
和 if __FILE__ == $0,只有在直接打开脚本时才会运行。
这似乎是我在 Java(我学校的“官方”编程语言)中没有看到的一个非常有用的功能。 Java中是否有与此等价的东西?如果没有,有什么方法可以实现吗?
【问题讨论】:
标签: java ruby equivalent
java 有public static void main(String[] args) 方法。当一个类从命令行作为主类运行时调用 this,并且通常仅在这种情况下调用(您可以直接调用它,但通常没有意义)。所以,在java中,标准是把“主调用”逻辑放在这个方法中。
【讨论】:
main 函数不会仅仅通过将类作为库包含在项目中来调用。如果你想为一个库运行main,你必须不遗余力地显式调用它。
真正的问题不是“我如何在 Java 中做到这一点?”它是“为什么 Ruby 和 Python 需要这样的组合?”
答案是 Ruby 和 Python 期望在文件加载时从头到尾执行文件(作为库或作为主程序),所以你需要一个 hack 说“不要运行这部分如果我被称为图书馆”。 Java 不期望从头到尾运行文件或类。它在特定类中有一个main(),其中包含该类用作主程序时的代码。因此,Java 不需要这种 hack。
(C和C++在这方面和Java很像,但是你在一个程序中只能有一个main()函数,所以你要么需要求助于使用预处理器来决定编译哪个,要么你需要将不同的main()函数放在不同的文件中,只编译你需要的文件。)
【讨论】:
获取堆栈跟踪并查看第一种方法:
Throwable t = new Throwable();
StackTraceElement[] elems = t.getStackTrace();
... elems[elems.length-1] should contain a main method ... check if it is yours :) ...
【讨论】:
main 的静态方法。