18

I am just curious on how people solve this. I often write the same type of code all the time. For instance:

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

I keep changing the line where it says "Change this line" and then starting a thread. This change can be one line or a few lines. How would I go about compacting this code?

4

7 回答 7

21

Well, I guess you could run your java files through the C preprocessor...

于 2009-11-13T22:19:55.153 回答
18

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

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 中设置它们的信息,你可以在有用的 Eclipse Java 代码模板中找到有用的列表

于 2009-11-13T22:42:33.117 回答
8

One technique is to put the code in an anonymous inner class, and pass that to a method that does the rest.

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();
}

Generally it isn't a good idea to extend Thread or other classes if it is unnecessary.

于 2009-11-13T22:18:37.680 回答
7

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

于 2009-11-13T22:20:52.943 回答
1

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

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

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

于 2009-11-14T00:55:39.343 回答
0

Nope, no macros. For this case, the closest you can get is to create new Runnable instance and pass it to either a function of your own creation or an ExecutorService, which will start the task for you.

With Java, there's no good way to get rid of this "boilerplate" code, mainly because you can't pass pointers to functions; everything needs to be an object.

于 2009-11-13T22:19:30.230 回答
0

在线程的情况下,您可以将任何实现的对象传递Runnable给它的构造函数。

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

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

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

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

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

编辑:如果您需要的不仅仅是 start 方法,您还可以对其进行子类化Thread

于 2009-11-13T22:27:39.327 回答