Java:是不是支持宏?

Posted

技术标签:

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

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

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

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

【问题讨论】:

这根本不是您问题的答案,但通常认为实现 Runnable 比扩展 Thread 更正确。原因很简单,您想要更改的并不是真正的线程行为(即运行 Runnable),而是它运行的内容。 【参考方案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 本身。

【讨论】:

以上是关于Java:是不是支持宏?的主要内容,如果未能解决你的问题,请参考以下文章

c语言宏定义问题

支持张文宏医生!

支持张文宏医生!

gcc编译汇编源码时怎样支持#define宏定义

js宏编程--ES6介绍

__COUNTER__ 宏是不是可移植?