我和我的一个朋友讨论过在Java中正确使用main方法的问题。基本上我们有这样一个类:
public class AnImporter implements Runnable {
// some methods, attributes, etc.
}
但是主要方法放在哪里?我认为将代码保留在它所属的位置是一种很好的做法,因此将上述代码转换为
public class AnImporter implements Runnable {
public static void main(String [] args){
// Startup code for Importer App here
}
// some methods, attributes, etc.
}
虽然我的好友认为“启动代码与应用程序本身无关”,但它应该放在另一个类中,如下所示:
public class AnImporter implements Runnable {
// some methods, attributes, etc.
}
public class AnApplication {
// Nothing here
public static void main(String [] args){
AnImporter a = new AnImporter();
// Startup code here
}
// Nothing here
}
尽管我们讨论了这个问题已有一段时间了,但我们最终都没有得出结论,哪种方式是Java中更好的方法。你对这个话题有什么看法?在哪里,最重要的是,为什么,您将主要方法放在放置它的位置?
答案 0 :(得分:35)
我同意你的朋友。您正在AnImporter中构建可能可重用的服务,该服务可能会在具有多个主服务器的多个程序中使用。因此,制作一个主要特殊内容并将其嵌入AnImporter中没有多大意义。
答案 1 :(得分:14)
我可能会和你的朋友一起去,因为我希望尽快用主要的方法离开课堂。当你想要原子地测试(只是可运行的类)或者你想要模拟出来时,它有助于促进测试。越早离开主方法,您拥有的选项就越多。如果你有一个主要方法和其他内容的类,它可能很快就会变得混乱。 (即使用一个简单的例子,例如你描述的那个例子,它可能看起来不那样)
但我认为可读性和可测试性是尽快摆脱主要方法(及其包含类)的两个很好的理由。但是嘿......那只是我;)
答案 2 :(得分:11)
我不会使用main方法污染Runnable类。几乎任何在您的应用程序中执行任何操作的类都是如此。一般来说,我会有一个这样的课程:
public class App {
public static void main(String args[]) {
Thread t = new Thread(new Blah());
t.start();
synchronized (t) {
t.wait();
}
}
}
public class Blah implements Runnable {
public void run() {
// do normal stuff
}
}
而不是:
public class Blah implements Runnable {
public void run() {
// do normal stuff
}
public static void main(String args[]) {
Thread t = new Thread(new Blah());
t.start();
synchronized (t) {
t.wait();
}
}
}
感觉更干净。
答案 3 :(得分:7)
我总是将main与其余代码分开,原因如下:
1)在某种程度上,主要是让你的程序从命令行启动的黑客攻击。任何包含它的类应该只有一个责任:让程序从命令行开始。通过将它与主运行程序放在一起,就会污染可运行的程序。
2)你可能最终拥有多个主电源(例如,某些默认参数,特殊模式等)。
3)您最终可能会从不同的环境(例如,Eclipse插件或OGSI模块,applet,基于Web的工具等)运行该程序。在这些情况下,您可能希望限制对main的访问。使用该功能可以防止这种情况。
4)有时更容易将main保留在默认包中以更快地执行运行时(例如,java myblabla par1 par2 par3),但您绝对不希望其余代码位于默认包中。
答案 4 :(得分:2)
除了OS shell之外,main(字符串列表)的接口几乎没用。
你的主人应该拥有尽可能少的代码。
实际上,您的public class ThisIsMyApp {...}
应该只是实际工作的操作系统界面,而在其他地方。
答案 5 :(得分:0)
我会将主方法与代码分开。
虽然我也有不同类型的项目。它不包括解决方案的实际工作程序。在这里,我需要使用(和开发)相同的库为不同的问题运行不同的解决方案。不同的问题并不平行。我需要从IDE中单独运行一个问题。我发现使用带有PSVM方法的大量类的相同项目很方便。
该项目包含针对400多个不同问题的编程竞赛解决方案。你有更好的组织吗?