【问题标题】:Java: Is there support for macros?Java:是否支持宏?
【发布时间】:2010-12-16 11:27:22
【问题描述】:

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

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

我不断更改显示“更改此行”的行,然后启动一个线程。此更改可以是一行或几行。我将如何压缩此代码?

【问题讨论】:

  • 这根本不是您问题的答案,但通常认为实现 Runnable 比扩展 Thread 更正确。原因很简单,您想要更改的并不是真正的线程行为(即运行 Runnable),而是它运行的内容。

标签: java macros boilerplate


【解决方案1】:

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

【讨论】:

  • 这不是我听过的最疯狂的事情,但它几乎接近!
  • 同意 - 这不是一张漂亮的照片。
  • -1:我无法清楚解释原因,但我不喜欢这种方法。
  • @OutlawProgrammer 我在一家公司工作,该公司用 C/C++ Java 代码转换、生成来完成疯狂的事情......这就是其中之一。
  • @StephaneRolland 这个解决方案可能会给世界带来混乱。 +1
【解决方案2】:

您可以使用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 找到有用的列表

【讨论】:

  • 不确定你为什么要被改装,这是 exact 正确答案,如果从他所说的来看,那些 //... 行很常见。跨度>
  • 不就是压缩代码,而不是让它变长吗?
  • @Sotanaht 通过“压缩代码”,OP 意味着实现 DRY 原则。是的,基类有点长,但现在每当他必须编写另一个线程时,只有 4 行样板代码加上唯一代码。如果一般行为很大,那么很快就会增加输入的行数。
【解决方案3】:

一种技术是将代码放入匿名内部类中,然后将其传递给完成其余工作的方法。

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 或其他类不是一个好主意。

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • +1:用于实现我自己的注释的技巧。从来没想过。
    • 如果您知道在哪里看,这并不难,但如果包含一个或两个参考链接可能会受到赞赏。
    【解决方案5】:

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

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

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

    【讨论】:

      【解决方案6】:

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

      对于 Java,没有什么好的方法可以摆脱这种“样板”代码,主要是因为您不能将指针传递给函数;一切都需要是一个对象。

      【讨论】:

        【解决方案7】:

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

        所以,解决方案是创建自己的类:

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

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

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

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

        编辑:如果您需要的不仅仅是 start 方法,您还可以继承 Thread 本身。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-04-27
          • 2019-02-19
          • 2019-03-24
          • 2016-01-04
          • 1970-01-01
          • 2017-08-30
          相关资源
          最近更新 更多