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:是不是支持宏?的主要内容,如果未能解决你的问题,请参考以下文章