kry*_*oko 36 java coding-style
我和我的一个朋友讨论过在Java中正确使用main方法的问题.基本上我们有这样一个类:
public class AnImporter implements Runnable {
// some methods, attributes, etc.
}
Run Code Online (Sandbox Code Playgroud)
但在哪里放主要方法?我认为将代码保留在其所属的位置是一种很好的做法,从而将上述代码转换为
public class AnImporter implements Runnable {
public static void main(String [] args){
// Startup code for Importer App here
}
// some methods, attributes, etc.
}
Run Code Online (Sandbox Code Playgroud)
虽然我的好友认为"启动代码与应用程序本身无关",但它应该放在另一个类中,如下所示:
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
}
Run Code Online (Sandbox Code Playgroud)
尽管我们讨论了这个问题已经有一段时间了,但我们最终都没有得出结论,哪种方式是Java中更好的方法.你对这个话题有什么看法?在哪里,最重要的是,为什么,您将主要方法放在放置它的位置?
Cli*_*ler 35
我同意你的朋友.您正在AnImporter中构建可能可重用的服务,该服务可能会在具有多个主服务器的多个程序中使用.因此,使一个主要特殊并将其嵌入AnImporter并没有多大意义.
dig*_*nie 14
我可能会和你的朋友一起去,因为我宁愿尽可能快地走出课堂.当你想要原子地测试(只是可运行的类)或者你想要模拟出来时,它有助于促进测试.越早离开主方法,您拥有的选项就越多.如果你有一个主要方法和其他内容的类,它可能很快就会变得混乱.(即使用一个简单的例子,例如你描述的那个例子,它可能看起来不那样)
但我认为可读性和可测试性是尽快摆脱主要方法(及其包含类)的两个很好的理由.但是嘿..这只是我;)
cle*_*tus 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
}
}
Run Code Online (Sandbox Code Playgroud)
代替:
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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
它感觉更干净.
我总是将main与其余代码分开,原因如下:
1)在某种程度上,主要是让你的程序从命令行启动的黑客攻击.任何包含它的类应该只有一个责任:让程序从命令行开始.通过将它与主运行程序放在一起,就会污染可运行的程序.
2)您可能最终拥有多个主电源(例如,具有某些默认参数,具有特殊模式等)
3)您最终可能会从不同的环境(例如,Eclipse插件或OGSI模块,applet,基于Web的工具等)运行该程序.在这些情况下,您可能希望限制对main的访问.使用该功能可以防止这种情况发生.
4)有时更容易将main保留在默认包中以更快地执行运行时(例如,java myblabla par1 par2 par3),但您绝对不希望其余代码在默认包中.