寻找有用的 Eclipse Java 代码模板 [已关闭]

Seeking useful Eclipse Java code templates [closed]

提问人: 提问时间:6/23/2009 最后编辑:23 revs, 3 users 96%Jon 更新时间:6/10/2019 访问量:214822

问:


想改进这个问题吗?通过编辑这篇文章来更新问题,使其仅关注一个问题。

9年前关闭。

社区在 1 年前审查了是否重新讨论这个问题,并将其关闭:

原始关闭原因未解决

您可以通过以下方式在 Eclipse 中创建各种 Java 代码模板

Java>编辑器>模板>窗口>首选项

例如:

sysout扩展为:

System.out.println(${word_selection}${});${cursor}

您可以通过键入后跟sysoutCTRL+SPACE

您目前使用哪些有用的 Java 代码模板?包括它的名称和描述以及它为什么很棒。

我正在寻找模板的原创/新颖用途,而不是内置的现有功能。

  • 创建 Log4J 记录器
  • 从显示中获取 swt 颜色
  • Syncexec - Eclipse 框架
  • 单例模式/枚举单例生成
  • 读取文件
  • 常量
  • 追踪
  • 格式化字符串
  • 注释代码审查
  • 字符串格式
  • 尝试 Finally Lock
  • 消息格式 i18n 和日志
  • Equalsbuilder的
  • 哈希码生成器
  • Spring 对象注入
  • 创建 FileOutputStream
Java Eclipse 模板 IDE 代码生成

评论

5赞 GreenKiwi 9/23/2011
有没有从枚举生成包含所有可能情况的 switch 语句?我知道你可以用 CTRL+1 来做到这一点,但我宁愿使用 cmd 完成。
4赞 CodyBugstein 5/15/2013
你能解释一下是什么意思吗?听起来有一种方法可以选择一个单词并自动将其包含在通话中,对吗?如何?System.out.println(${word_selection}${});${cursor}sysout
3赞 JReader 8/20/2014
突出显示要被 sysout 调用包围的单词,然后按 Ctrl-空格键(如果您有很多突出显示感知模板,则键入模板的名称)
1赞 Roland 2/15/2017
@JReader ${} 有什么作用呢?
0赞 Peter Mortensen 11/26/2022
Stack Overflow 的 The Tyrannical Mods 中用作示例。(但请注意,该视频中有很多事实信息是完全错误的,例如,谷歌会将对答案的投票考虑在搜索排名中)。

答:

25赞 cgp #1

对于 ,一个有用的小曲子,可以添加到成员变量中。log

private static Log log = LogFactory.getLog(${enclosing_type}.class);

评论

0赞 Jack Miller 2/26/2015
要手动写入日志文件: ${:import(java.io.PrintWriter, java.io.BufferedWriter, java.io.FileWriter)} try { PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(${logFile:var(String)}, true))); out.println(${logLine:var(String)}${cursor}); out.close(); } catch (IOException e) { /* TODO: 异常处理 */ e.printStackTrace(); }
0赞 Peter Mortensen 11/26/2022
什么是“小曲”(在这种情况下)?
0赞 cgp 2/27/2023
@PeterMortensen 根据定义,Ditty 是一首短歌,但在会话英语中,我听说它几乎被用作任何重复的东西。
21赞 3 revs, 2 users 74%Artem Barger #2

我心爱的人之一是 foreach

for (${iterable_type} ${iterable_element} : ${iterable}) {
    ${cursor}
}

还有追踪,因为我经常使用它进行跟踪:

System.out.println("${enclosing_type}.${enclosing_method}()");

我只是想了另一个,有一天在互联网上找到了它,const

private static final ${type} ${name} = new ${type} ${cursor};

评论

11赞 Rich Seller 7/3/2009
foreach 可作为 Eclipse 中的标准代码辅助,我看不出您的模板对标准版本有任何其他作用
4赞 Artem Barger 7/4/2009
是的,sysout 是一个非常创新的模板。问题是关于我们正在使用的有用模板。
4赞 dogbane 8/9/2011
ur 在 Eclipse 中已经作为 .traceoutsystrace
7赞 Artem Barger 8/16/2011
很好,由于这个问题,我想相信它现在出现在 Eclipse 中。
0赞 Armand 3/14/2015
const 可作为标准代码辅助static_final(但不确定它是何时添加的)
427赞 7 revs, 6 users 65%Robert Munteanu #3

如果需要,以下代码模板将创建记录器并创建正确的导入。

SLF4J型

${:import(org.slf4j.Logger,org.slf4j.LoggerFactory)}
private static final Logger LOG = LoggerFactory.getLogger(${enclosing_type}.class);

日志4J 2

${:import(org.apache.logging.log4j.LogManager,org.apache.logging.log4j.Logger)} 
private static final Logger LOG = LogManager.getLogger(${enclosing_type}.class); 

日志4J

${:import(org.apache.log4j.Logger)}
private static final Logger LOG = Logger.getLogger(${enclosing_type}.class);

来源

七月

${:import(java.util.logging.Logger)}
private static final Logger LOG = Logger.getLogger(${enclosing_type}.class.getName());

评论

3赞 Adam Crume 7/8/2009
我认为${:import ...}仅适用于较新版本的Eclipse。我坚持使用 3.2,它对我不起作用。
0赞 finnw 2/3/2010
也不在我的版本(3.5)中。有谁知道它是在哪个版本中引入的?
0赞 Robert Munteanu 2/3/2010
它在 3.5 中对我来说效果很好。
5赞 Dario Seidl 7/21/2014
我喜欢!但是我把${import ...}放在Logger声明下面,这样它就不会添加新行。
0赞 TMS 5/20/2016
对于 log4j2,我必须将模板设置为: ${:import(org.apache.logging.log4j.LogManager,org.apache.logging.log4j.Logger)} private static final Logger LOG = LogManager.getLogger(${enclosing_type}.class);
8赞 3 revs, 2 users 95%Manuel Selva #4

从当前显示中获取 SWT 颜色:

Display.getCurrent().getSystemColor(SWT.COLOR_${cursor})

Suround 与 syncexec

PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable(){
    public void run(){
        ${line_selection}${cursor}
    }
});

使用单例设计模式:

/**
 * The shared instance.
 */
private static ${enclosing_type} instance = new ${enclosing_type}();

/**
 * Private constructor.
 */
private ${enclosing_type}() {
    super();
}

/**
 * Returns this shared instance.
 *
 * @returns The shared instance
 */
public static ${enclosing_type} getInstance() {
    return instance;
}

评论

3赞 Pablojim 7/3/2009
只是一个简短的说明 - 根据 Maestro Joshua Bloch 的说法,使用 Enum 应该是在 Java 中创建单例的首选方法。
0赞 Manuel Selva 7/3/2009
嗨,Pablojim,自从我发布这个模板以来,我开始阅读有效的 Java,并将我的单例实现更改为枚举。然而,我没有找到一种方法让模板生成枚举,从而修改类声明。你有这个模板吗?谢谢马努
0赞 pjp 7/3/2009
仅供参考:这是枚举单例模式 electrotek.wordpress.com/2008/08/06/...。我不是特别喜欢它,但我没有很多单身人士。将其转换为 Java 模板很容易。
1赞 MetroidFan2002 6/12/2011
对于枚举方法,我希望你所有的单例都作为可比较的、可序列化的对象有意义,因为很多单例没有(他想知道为什么这个“......方法尚未被广泛采用“——因为可比性和序列化对于某些单例类没有意义!
0赞 Johannes Kuhn 8/25/2012
序列 化?是的。考虑使用对 Singleton 的引用来序列化 Object。如果它不可序列化,则可能会遇到 NPE。如果是(并且您没有添加方法来覆盖默认的反序列化),那么您可能会得到“Singleton”的另一个实例。
49赞 3 revs, 3 users 71%Jon #5

以下是一些其他模板: 链接 I - 链接 II

我喜欢这个:

读取文件

 ${:import(java.io.BufferedReader,  
           java.io.FileNotFoundException,  
           java.io.FileReader,  
           java.io.IOException)}  
 BufferedReader in = null;  
 try {  
    in = new BufferedReader(new FileReader(${fileName}));  
    String line;  
    while ((line = in.readLine()) != null) {  
       ${process}  
    }  
 }  
 catch (FileNotFoundException e) {  
    logger.error(e) ;  
 }  
 catch (IOException e) {  
    logger.error(e) ;  
 } finally {  
    if(in != null) in.close();  
 }  
 ${cursor} 

更新:此模板的 Java 7 版本是:

${:import(java.nio.file.Files,
          java.nio.file.Paths,
          java.nio.charset.Charset,
          java.io.IOException,
          java.io.BufferedReader)}
try (BufferedReader in = Files.newBufferedReader(Paths.get(${fileName:var(String)}),
                                                 Charset.forName("UTF-8"))) {
    String line = null;
    while ((line = in.readLine()) != null) {
        ${cursor}
    }
} catch (IOException e) {
    // ${todo}: handle exception
}

评论

48赞 benmmurphy 7/6/2009
我认为这就是:)的方法
3赞 Jonathan Holloway 7/7/2009
呃,我想你错过了重点......说我其实不知道你的意思是什么......这是关于代码生成而不是模块化......
21赞 Scott McIntyre 6/10/2011
我认为关键是,在模板中添加这么多代码是在非常常见的情况下进行剪切和粘贴编程。
6赞 Mike Clark 9/26/2013
是的,您应该使用实用程序方法来读取文件,而不是粘贴代码块。自己编写一个方法,或使用 Apache commons-io IOUtils。尽管如此,如果您使用不同的类路径创建大量一次性项目,那么在实用程序类中添加 JAR 或链接只是为了读取文件可能会很痛苦。有时你只需要编写一些一次性代码来读取文件,然后继续你的生活。
1赞 Mike Clark 9/26/2013
在 Java 7 中,首选 而不是 .StandardCharsets.UTF_8Charset.forName("UTF-8")
14赞 ist_lion #6

对于代码生产来说没什么花哨的 - 但对于代码审查非常有用

我有我的模板 coderev low/med/high 执行以下操作

/**
 * Code Review: Low Importance
 * 
 *
 * TODO: Insert problem with code here 
 *
 */

然后在“任务”视图中 - 将显示我想在会议期间提出的所有代码审查注释。

5赞 skaffman #7

我喜欢这样的生成类评论:

/**
 * I... 
 * 
 * $Id$
 */

“I...”立即鼓励开发人员描述类的作用。我似乎确实改善了无证类的问题。

当然,$Id$ 是一个有用的 CVS 关键字。

4赞 2 revsMario Ortegón #8

我将其用于 MessageFormat(使用 Java 1.4)。这样,我就可以确定在进行国际化时,我没有难以提取的串联

i18n系列

String msg = "${message}";
Object[] params = {${params}};
MessageFormat.format(msg, params);

也用于日志记录:

日志

if(logger.isDebugEnabled()){
  String msg = "${message}"; //NLS-1
  Object[] params = {${params}};
  logger.debug(MessageFormat.format(msg, params));
}
9赞 2 revs, 2 users 89%pjp #9

strf -> String.format("msg", args)非常简单,但节省了一点打字。

String.format("${cursor}",)

评论

6赞 Duncan Jones 2/13/2012
我之所以使用,是因为 Eclipse 允许我在字符串和对象列表之间切换。String.format("${string}",${objects})
0赞 Christophe Roussy 10/29/2014
我使用这个版本:,首先选择一个字符串,然后在上面使用“sf”。添加 %s 等...String.format(${word_selection}${},)${cursor}
20赞 Scott Stanchfield #10

关于sysout的一个小提示 - 我喜欢将其重命名为“sop”。java 库中没有其他内容以“sop”开头,因此您可以快速键入“sop”并插入。

评论

11赞 MasterScrat 8/10/2011
默认情况下,只需键入 syso 即可执行与 sysout 相同的操作。
9赞 Scott Stanchfield 11/8/2011
不过,用 sop 打败你 25%...... ;)
2赞 bobbel 7/30/2015
从 Eclipse Mars 开始,快捷键“syso”+ Ctrl + Space 有一个糟糕的倒退:它将列出一些名称中带有字符 s、y、s 和 o 的类(由于新的 CamelCase 发现)。因此,现在您必须另外从列表中选择 sysout 并按 Return 键。
33赞 2 revsjamesh #11

设置字符串格式

MessageFormat - 用 MessageFormat 将所选内容括起来。

 ${:import(java.text.MessageFormat)} 
 MessageFormat.format(${word_selection}, ${cursor})

这样,我就可以将光标移动到字符串,将所选内容扩展到整个字符串 (Shift-Alt-Up),然后按 Ctrl-空格键两次。

锁定所选内容

锁定 - 用 Try finally Lock 包围所选行。假设存在锁定变量。

${lock}.acquire();
try {
    ${line_selection}
    ${cursor}
} finally {
    ${lock}.release();
}

NB 模板显示在“环绕声”菜单 (Alt-Shift-Z) 中。${line_selection}

评论

0赞 Pierre Henry 10/22/2012
我将它与日志语句结合使用:logger.info(MessageFormat.format(${word_selection}, ${cursor});
0赞 Marco Lackovic 3/10/2014
获取和释放锁的方法称为 和 。 并用于信号量,并且不强烈建议在 try-finally 块中使用它们,而不是像使用锁那样强烈建议使用它们lockunlockacquirerelease
0赞 Noumenon 12/11/2019
Ctrl+空格键两次似乎不再起作用,调出 SWT 模板。有替代品吗?
8赞 Jonathan Holloway #12

还有一个 equalsbuilder、hashcodebuilder 改编:

${:import(org.apache.commons.lang.builder.EqualsBuilder,org.apache.commons.lang.builder.HashCodeBuilder)}
@Override
public boolean equals(Object obj) {
    return EqualsBuilder.reflectionEquals(this, obj);
}

@Override
public int hashCode() {
    return HashCodeBuilder.reflectionHashCode(this);
}

评论

0赞 gswierczynski 4/17/2014
对于没有反思的解决方案,请参阅下面的链接
17赞 2 revs, 2 users 56%javaguy #13

抛出一个 IllegalArgumentException,其中包含当前作用域 (illarg) 中的变量:

throw new IllegalArgumentException(${var});

更好

throw new IllegalArgumentException("Invalid ${var} " + ${var});  
8赞 fgui #14

记录器声明的模板很棒。

我还为我经常使用的日志级别创建了 linfo、ldebug、lwarn、lerror。

lerror:

logger.error(${word_selection}${});${cursor}
4赞 jeff porter #15

我最喜欢的几个是......

1:Javadoc,插入有关该方法的文档是Spring对象注入方法。

 Method to set the <code>I${enclosing_type}</code> implementation that this class will use.
* 
* @param ${enclosing_method_arguments}<code>I${enclosing_type}</code> instance 

2:调试窗口,用于创建 FileOutputStream 并将缓冲区的内容写入文件。 用于将缓冲区与过去的运行进行比较(使用 BeyondCompare),或者由于缓冲区太大而无法查看缓冲区的内容(通过检查)时...

java.io.FileOutputStream fos = new java.io.FileOutputStream( new java.io.File("c:\\x.x"));
fos.write(buffer.toString().getBytes());
fos.flush();
fos.close();
28赞 2 revs, 2 users 96%questzen #16

我知道我正在踢一个死帖子,但为了完成而想分享这个:

单例生成模板的正确版本,克服了有缺陷的双重检查锁定设计(上面讨论过,其他地方也提到过)

单例创建模板:将此命名为createsingleton

static enum Singleton {
    INSTANCE;

    private static final ${enclosing_type} singleton = new ${enclosing_type}();

    public ${enclosing_type} getSingleton() {
        return singleton;
    }
}
${cursor}


要访问使用上述方法生成的单例,请执行以下操作:

单例参考模板:命名这个 :getsingleton

${type} ${newName} = ${type}.Singleton.INSTANCE.getSingleton();

评论

4赞 Jonathan Holloway 7/16/2010
它并没有死,它是社区维基,所以当你找到它们时,添加更多的模板是有意义的。其他任何地方都没有一套全面的这些......
0赞 questzen 7/23/2010
乔恩,之前的帖子和我的帖子之间的时间间隔将近 8 个月,这就是不得不引用的原因。我不能比你的评论更好的措辞:)
0赞 Mr_and_Mrs_D 6/5/2012
当我将其创建为类(类中的嵌套枚举)的一部分时,我得到了类的名称 - 预期?${enclosing_type}
1赞 Mike Adler 6/6/2012
@Mr_and_Mrs_D,我认为这就是重点。您将获得放置此模板的类的单一实例。现在,您需要做的就是将封闭类型构造函数设为私有,并拥有一个非常安全的单例生成器。
0赞 Robert Smit 9/10/2015
如果要使用它来创建枚举,请使用示例:${primary_type_name}public enum ${primary_type_name} { INSTANCE; private ${return_type} ${name} = new ${return_type}(); public ${return_type} ${getName}(${}) { return ${name}; } ${cursor} }
14赞 3 revs, 2 users 95%lrussell #17

这里还有更多模板。

包括:

  • 从特定日期创建日期对象
  • 创建新的泛型 ArrayList
  • 记录仪设置
  • 指定级别的日志
  • 创建一个新的泛型 HashMap
  • 遍历地图,打印键和值
  • 使用 SimpleDateFormat 分析时间
  • 逐行读取文件
  • 记录并重新抛出捕获的 exeption
  • 打印代码块的执行时间
  • 创建定期计时器
  • 将 String 写入文件

评论

0赞 berezovskyi 9/23/2016
添加了 Wayback Machine 链接
8赞 3 revsBenny Jobigan #18

为事件创建一切

由于在 Java 中创建事件有点痛苦——所有这些接口、方法和东西都只为 1 个事件编写——我制作了一个简单的模板来创建 1 个事件所需的一切。

${:import(java.util.List, java.util.LinkedList, java.util.EventListener, java.util.EventObject)}

private final List<${eventname}Listener> ${eventname}Listeners = new LinkedList<${eventname}Listener>();

public final void add${eventname}Listener(${eventname}Listener listener)
{
    synchronized(${eventname}Listeners) {
        ${eventname}Listeners.add(listener);
    }
}

public final void remove${eventname}Listener(${eventname}Listener listener)
{
    synchronized(${eventname}Listeners) {
        ${eventname}Listeners.remove(listener);
    }
}

private void raise${eventname}Event(${eventname}Args args)
{
    synchronized(${eventname}Listeners) {
        for(${eventname}Listener listener : ${eventname}Listeners)
            listener.on${eventname}(args);
    }
}

public interface ${eventname}Listener extends EventListener
{
    public void on${eventname}(${eventname}Args args);
}

public class ${eventname}Args extends EventObject
{
    public ${eventname}Args(Object source${cursor})
    {
        super(source);
    }
}

如果您有共享单个事件的事件,只需删除模板插入的自定义事件并更改 和 的相应部分。EventObjectraise___()on____()

我使用泛型接口和泛型类编写了一个不错的、小巧的、优雅的事件机制,但由于 Java 处理泛型的方式,它不起作用。=(

编辑: 1) 我遇到了线程在事件发生时添加/删除侦听器的问题。使用时无法修改,因此我在访问或使用侦听器列表的地方添加了块,锁定了列表本身。Listsynchronized

评论

0赞 ssindelar 3/14/2015
在锁中发送事件(同步或其他方式)是等待发生的死锁。在这种情况下,最好在同步块中复制侦听器并迭代新列表。
0赞 Stefan Dollase 12/25/2015
使用 ConcurrentLinkedQueue。它不需要锁定,因为它有一个弱一致性迭代器,该迭代器从不抛出 ConcurrentModificationException。
23赞 2 revs, 2 users 85%Prashant Bhate #19

空检查!

if( ${word_selection} != null ){
    ${cursor}
}

if( ${word_selection} == null ){
    ${cursor}
}

评论

0赞 Thorbjørn Ravn Andersen 6/22/2013
Guava 中的方法是一种非常可读的替代方法(尤其是静态导入)PreConditions.checkNotNull(...)
1赞 KrishPrabakar 2/19/2014
最佳做法是先检查 null (== null),然后再检查 not null。
12赞 Prashant Bhate #20

slf4j 日志记录

${imp:import(org.slf4j.Logger,org.slf4j.LoggerFactory)}

private static final Logger LOGGER = LoggerFactory
    .getLogger(${enclosing_type}.class);
7赞 Mike Clark #21

弹簧注射

我知道这有点晚了,但这是我在一堂课上用于 Spring Injection 的一个:

${:import(org.springframework.beans.factory.annotation.Autowired)}
private ${class_to_inject} ${var_name};

@Autowired
public void set${class_to_inject}(${class_to_inject} ${var_name}) {
  this.${var_name} = ${var_name};
}

public ${class_to_inject} get${class_to_inject}() {
  return this.${var_name};
}
10赞 qualidafial #22

Bean 属性

private ${Type} ${property};

public ${Type} get${Property}() {
    return ${property};
}

public void set${Property}(${Type} ${property}) {
    ${propertyChangeSupport}.firePropertyChange("${property}", this.${property},     this.${property} = ${property});
}

PropertyChange支持

private PropertyChangeSupport ${propertyChangeSupport} = new PropertyChangeSupport(this);${:import(java.beans.PropertyChangeSupport,java.beans.PropertyChangeListener)}
public void addPropertyChangeListener(PropertyChangeListener listener) {
  ${propertyChangeSupport}.addPropertyChangeListener(listener);
}

public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) {
  ${propertyChangeSupport}.addPropertyChangeListener(propertyName, listener);
}

public void removePropertyChangeListener(PropertyChangeListener listener) {
  ${propertyChangeSupport}.removePropertyChangeListener(listener);
}

public void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) {
  ${propertyChangeSupport}.removePropertyChangeListener(propertyName, listener);
}
24赞 4 revs, 3 users 74%mantrid #23

使用 Mockito 创建一个模拟(在“Java 语句”上下文中):

${:importStatic('org.mockito.Mockito.mock')}${Type} ${mockName} = mock(${Type}.class);

在“Java 类型成员”中:

${:import(org.mockito.Mock)}@Mock
${Type} ${mockName};

模拟 void 方法以抛出异常:

${:import(org.mockito.invocation.InvocationOnMock,org.mockito.stubbing.Answer)}
doThrow(${RuntimeException}.class).when(${mock:localVar}).${mockedMethod}(${args});

模拟一个 void 方法来做某事:

${:import(org.mockito.invocation.InvocationOnMock,org.mockito.stubbing.Answer)}doAnswer(new Answer<Object>() {
public Object answer(InvocationOnMock invocation) throws Throwable {
    Object arg1 = invocation.getArguments()[0];
    return null;
}
}).when(${mock:localVar}).${mockedMethod}(${args});

验证只调用一次的模拟方法:

${:importStatic(org.mockito.Mockito.verify,org.mockito.Mockito.times)}
verify(${mock:localVar}, times(1)).${mockMethod}(${args});

验证从不调用模拟方法:

${:importStatic(org.mockito.Mockito.verify,org.mockito.Mockito.never)}verify(${mock:localVar}, never()).${mockMethod}(${args});

使用 Google Guava 的新链表(以及类似的哈希集和哈希图):

${import:import(java.util.List,com.google.common.collect.Lists)}List<${T}> ${newName} = Lists.newLinkedList();

此外,我还使用一个巨大的模板来生成一个 Test 类。这是一个简短的片段,每个感兴趣的人都应该自定义:

package ${enclosing_package};

import org.junit.*;
import static org.junit.Assert.*;
import static org.hamcrest.Matchers.*;
import static org.mockito.Matchers.*;
import static org.mockito.Mockito.*;
import org.mockito.Mockito;
import org.slf4j.Logger;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import org.junit.runner.RunWith;

// TODO autogenerated test stub
@RunWith(MockitoJUnitRunner.class)
public class ${primary_type_name} {

    @InjectMocks
    protected ${testedType} ${testedInstance};
    ${cursor}

    @Mock
    protected Logger logger;

    @Before
    public void setup() throws Exception {
    }

    @Test
    public void shouldXXX() throws Exception {
        // given

        // when
        // TODO autogenerated method stub

        // then
        fail("Not implemented.");
    }
}
// Here goes mockito+junit cheetsheet

评论

1赞 Vladimir Sizikov 2/18/2012
我很好奇:你为什么要嘲笑伐木工?
6赞 mantrid 2/21/2012
您可以验证是否调用了模拟记录器,以防捕获异常(失败场景)。如果您不打算重新抛出它,但想要断言它不会被静默忽略,这在空间上非常有用。
9赞 Duncan Jones #24

在 GUI 线程上调用代码

我将以下模板绑定到快捷方式,以便在 GUI 线程上快速调度代码。slater

${:import(javax.swing.SwingUtilities)}
SwingUtilities.invokeLater(new Runnable() {      
      @Override
      public void run() {
        ${cursor}
      }
    });
7赞 David M. Coe #25

下面是不可实例化类的构造函数:

// Suppress default constructor for noninstantiability
@SuppressWarnings("unused")
private ${enclosing_type}() {
    throw new AssertionError();
}

这是针对自定义例外的:

/**
 * ${cursor}TODO Auto-generated Exception
 */
public class ${Name}Exception extends Exception {
    /**
     * TODO Auto-generated Default Serial Version UID
     */
    private static final long serialVersionUID = 1L;    

    /**
     * @see Exception#Exception()
     */
    public ${Name}Exception() {
        super();
    }

    /**
     * @see Exception#Exception(String) 
     */
    public ${Name}Exception(String message) {
        super(message);         
    }

    /**
     * @see Exception#Exception(Throwable)
     */
    public ${Name}Exception(Throwable cause) {
        super(cause);           
    }

    /**
     * @see Exception#Exception(String, Throwable)
     */
    public ${Name}Exception(String message, Throwable cause) {
        super(message, cause);
    }
}
5赞 2 revsErk #26

我经常使用这些片段,寻找值和空字符串。null

我使用“参数测试”模板作为我的方法中的第一个代码来检查收到的参数。

testNullArgument

if (${varName} == null) {
    throw new NullPointerException(
        "Illegal argument. The argument cannot be null: ${varName}");
}

您可能需要更改异常消息以符合公司或项目的标准。但是,我确实建议有一些消息包含违规参数的名称。否则,方法的调用方将不得不查看代码以了解出了什么问题。(没有消息的 A 会生成异常,其中包含相当荒谬的消息“null”)。NullPointerException

testNullOrEmptyStringArgument

if (${varName} == null) {
    throw new NullPointerException(
        "Illegal argument. The argument cannot be null: ${varName}");
}
${varName} = ${varName}.trim();
if (${varName}.isEmpty()) {
    throw new IllegalArgumentException(
        "Illegal argument. The argument cannot be an empty string: ${varName}");
}

您还可以重用上面的 null 检查模板,并实现此代码片段以仅检查空字符串。然后,您将使用这两个模板来生成上述代码。

然而,上面的模板有一个问题,如果 in 参数是最终的,你将不得不修改生成的代码(将失败)。${varName} = ${varName}.trim()

如果你使用了很多最终参数,并且想要检查空字符串,但不必将它们作为代码的一部分进行修剪,你可以改用这个:

if (${varName} == null) {
    throw new NullPointerException(
        "Illegal argument. The argument cannot be null: ${varName}");
}
if (${varName}.trim().isEmpty()) {
    throw new IllegalArgumentException(
        "Illegal argument. The argument cannot be an empty string: ${varName}");
}

testNullFieldState

我还创建了一些代码片段来检查未作为参数发送的变量(最大的区别是异常类型,现在改为异常类型)。IllegalStateException

if (${varName} == null) {
    throw new IllegalStateException(
        "Illegal state. The variable or class field cannot be null: ${varName}");
}

testNullOrEmptyStringFieldState

if (${varName} == null) {
    throw new IllegalStateException(
        "Illegal state. The variable or class field cannot be null: ${varName}");
}
${varName} = ${varName}.trim();
if (${varName}.isEmpty()) {
    throw new IllegalStateException(
        "Illegal state. The variable or class field " +
            "cannot be an empty string: ${varName}");
}

test参数

这是用于测试变量的通用模板。我花了几年时间才真正学会欣赏这个,现在我经常使用它(当然要结合上面的模板!

if (!(${varName} ${testExpression})) {
    throw new IllegalArgumentException(
        "Illegal argument. The argument ${varName} (" + ${varName} + ") " +
        "did not pass the test: ${varName} ${testExpression}");
}

输入一个变量名称或返回一个值的条件,后跟一个操作数(“==”、“<”、“>”等)和另一个值或变量,如果测试失败,生成的代码将引发 IllegalArgumentException。

if子句稍微复杂的原因,整个表达式都用“!()“是使得在异常消息中重用测试条件成为可能。

也许这会让同事感到困惑,但前提是他们必须查看代码,如果您抛出这些异常,他们可能不必查看代码......

下面是一个数组示例:

public void copy(String[] from, String[] to) {
    if (!(from.length == to.length)) {
        throw new IllegalArgumentException(
                "Illegal argument. The argument from.length (" +
                            from.length + ") " +
                "did not pass the test: from.length == to.length");
    }
}

您可以通过调用模板并键入 “from.length” [TAB] “== to.length” 来获得此结果。

结果比“ArrayIndexOutOfBoundsException”或类似方法更有趣,实际上可能让您的用户有机会找出问题所在。

享受!

10赞 2 revs, 2 users 92%Timothy055 #27

在 Java 7 之后,设置需要(或首选)对封闭类的静态引用的记录器的一个好方法是使用新引入的 MethodHandles API 在静态上下文中获取运行时类。

SLF4J 的示例代码片段如下:

private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());

除了在任何 IDE 中都是一个简单的代码片段之外,如果您将某些功能重构到另一个类中,它也不会那么脆弱,因为您不会意外地携带类名。

8赞 5 revs, 2 users 80%MacLuq #28

插入测试方法 should-given-when-then

我最近在与一位非常好的开发人员和朋友结对编程时看到了与此版本类似的版本,我认为它可能是此列表的一个很好的补充。

此模板将按照行为驱动开发 (BDD) 范式的给定 - 何时 - 然后方法在类上创建一个新的测试方法,作为构建代码的指南。它将以“should”开头的方法名称,并允许您将虚拟方法名称“CheckThisAndThat”的其余部分替换为测试方法责任的最佳描述。填写名称后,TAB 将直接将您带到 ,以便您可以开始键入前提条件。// Given section

我将其映射到三个字母“tst”,并描述“测试方法应该给出时”;)

我希望你觉得它和我看到它时一样有用:

@Test
public void should${CheckThisAndThat}() {
    Assert.fail("Not yet implemented");
    // Given
    ${cursor}

    // When


    // Then

}${:import(org.junit.Test, org.junit.Assert)}

评论

0赞 Torsten 10/24/2014
我喜欢那个模板。我添加了一个“throws Exception”,以进一步降低测试的舒适度。
0赞 bobbel 7/30/2015
我喜欢 BDD 范式。非常好的模板。请注意:您非常好的开发人员和朋友已经走了!
28赞 2 revs, 2 users 98%mmdemirbas #29

附加代码片段以迭代:Map.entrySet()

模板:

${:import(java.util.Map.Entry)}
for (Entry<${keyType:argType(map, 0)}, ${valueType:argType(map, 1)}> ${entry} : ${map:var(java.util.Map)}.entrySet())
{
    ${keyType} ${key} = ${entry}.getKey();
    ${valueType} ${value} = ${entry}.getValue();
    ${cursor}
}

生成的代码:

for (Entry<String, String> entry : properties.entrySet())
{
    String key = entry.getKey();
    String value = entry.getValue();
    |
}

Screenshot

评论

1赞 WesternGun 8/30/2018
就像你的图片一样,它向我展示了你可以使用一个变量,而不是 ,在字段之间启用“选项卡迭代”。谢谢。${}${cursor}
9赞 Calon #30

在使用代码进行测试时,我有时会错过删除一些 syso s。所以我给自己做了一个叫做 syt 的模板。

System.out.println(${word_selection}${});//${todo}:remove${cursor}

在编译之前,我总是检查我的待办事项,并且永远不会忘记再次删除 System.out。