Java:是否支持宏?

时间:2009-11-13 22:14:59

标签: java macros boilerplate

我很好奇人们如何解决这个问题。我经常写相同类型的代码。例如:

new Thread() {
   //...
   //...
   //...
   //Change this line
   //...
   //...
}.start();

我不断更改“更改此行”的行,然后启动一个帖子。此更改可以是一行或几行。我该如何压缩这段代码?

7 个答案:

答案 0 :(得分:21)

好吧,我想你可以通过C预处理器运行你的java文件......

答案 1 :(得分:18)

您可以使用template pattern创建包含公共代码的基类。例如:

public abstract class ThreadTemplate extends Thread
{

    public void run() {
        //reusable stuff
        doInThread();
        //more resusable stuff
    }

    abstract void doInThread();

}

然后使用样板代码启动一个线程就像这样简单:

new ThreadTemplate{
   void doInThread() {
       // do something
   }
}.start();

另外,一个不太优雅的解决方案就是使用ide的模板功能。您可以在Eclipse here中找到有关设置它们的一些信息,您可以在Useful Eclipse Java Code Templates找到有用的列表

答案 2 :(得分:8)

一种技巧是将代码放在一个匿名的内部类中,然后将其传递给另外一个方法。

interface SomeInterface {
    void fn();
}

    executeTask(new SomeInterface {
        public void fn() {
            // Change this line.
        }
    });

private void executeTask(final SomeInterface thing) {
     Thread thread = new Thread(new Runnable() { public void run() {
        //...
        //...
        //...
        thing.fn();
        //...
        //...
     }});
     thread.start();
}

一般来说,如果没有必要,扩展Thread或其他类不是一个好主意。

答案 3 :(得分:7)

可以使用Java注释生成样板代码。编写自己的注释处理器并不难。

答案 4 :(得分:1)

如果它是你在许多项目中使用的东西,我会在你的IDE中设置它。例如,我使用eclipse,如果你去 Window-> Preferences-> Java-> Editor->模板,您可以设置自己的模板,然后让它们自动完成。例如,我总是开始键入sysout,然后按Tab键,eclipse有一个内置模板,用System.out.println()替换它;

eclipse中有许多预先构建的模板,所以你可以查看那些关于语法的例子,如果那是你使用的IDE,如果没有,那么在其他IDE中可能会有类似的东西

这非常有用,您可以为自己编写的任何锅炉代码创建一个。

答案 5 :(得分:0)

不,没有宏。对于这种情况,最接近的是创建新的Runnable实例并将其传递给您自己创建的函数或ExecutorService,它将为您启动任务。

使用Java,没有好办法摆脱这种“样板”代码,主要是因为你无法将指针传递给函数;一切都需要成为一个对象。

答案 6 :(得分:0)

对于Thread,您可以将实现Runnable的任何对象传递给它的构造函数。

因此,解决方案是创建自己的类:

public class MyClass implements Runnable {
    void run() {
        // change this line
    }
}

不幸的是,run不是静态的,所以你必须先创建一个MyClass实例:

new Thread(new MyClass()).start();

您还可以向MyClass和构造函数添加变量,以便可以将参数传递给它。

编辑:如果您需要的不仅仅是start方法,还可以将Thread本身子类化。