有用的Eclipse Java代码模板

您可以通过Eclipse在Eclipse中创build各种Java代码模板

Window->Preferences->Java -> Editor -> Templates 

例如

sysout被扩展为:

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

你可以通过inputsysout然后按CTRL+SPACE来激活它

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

有一个开放的赏金在这个原始/新颖的使用模板,而不是一个内置的现有function。

  • 创buildLog4Jlogging器
  • 显示swt颜色
  • Syncexec – Eclipse框架
  • 单例模式/枚举单例生成
  • READFILE
  • 常量
  • Traceout
  • 格式string
  • 评论代码审查
  • string格式
  • 试试最后locking
  • 消息格式i18n和日志
  • Equalsbuilder
  • Hashcodebuilder
  • Spring对象注入
  • 创buildFileOutputStream

下面的代码模板将创build一个logging器,并根据需要创build正确的导入。

SLF4J

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

Log4J 2

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

Log4J的

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

来源 。

JUL

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

一些额外的模板在这里: 链接I – 链接II

我喜欢这一个:

ReadFile的

  ${: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 } 

格式化一个string

MessageFormat – 用MessageFormat环绕select。

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

这可以让我将光标移动到一个string,将select扩大到整个string(Shift-Alt-Up),然后再按Ctrl-Space两次。

lockingselect

locking – 围绕选定的行,试试最后locking。 假定存在一个lockingvariables。

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

NB ${line_selection}模板显示在Surround With菜单中(Alt-Shift-Z)。

我知道我正在踢死一个post,但是为了完成,我想分享一下:

单一代生成模板的正确版本,克服了有缺陷的双重检查lockingdevise(上面讨论和其他地方提到)

单身人士创造模板:将此命名为单人

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

对于log ,添加成员variables是一个有用的小小事。

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

附加代码片段来迭代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(); | } 

截图

空检查!

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

我的一个爱人是foreach

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

跟踪 ,因为我使用它很多跟踪:

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

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

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

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

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

而在“Javatypes成员”中:

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

模拟一个void方法来抛出exception:$ {:import(org.mockito.invocation.InvocationOnMock,org.mockito.stubbing.Answer)} doThrow($ {RuntimeException} .class).when($ {mock:localVar}) $ {mockedMethod}($ {ARGS});

嘲笑一个无效的方法来做一些事情:

 ${: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});

validation模拟方法从不被调用:

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

使用Google Guava的新链接列表(以及类似的hashset和hashmap):

 ${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 

sysout的一点小技巧 – 我喜欢把它改名为“sop”。 java库中没有其他的东西以“sop”开头,所以你可以快速input“sop”和繁荣,它插入。

在当前作用域(illarg)中使用variables抛出IllegalArgumentException:

 throw new IllegalArgumentException(${var}); 

更好

 throw new IllegalArgumentException("Invalid ${var} " + ${var}); 

代码生成没有什么奇怪的地方 – 但对代码评论非常有用

我有我的模板coderev低/中/高执行以下操作

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

然后在任务视图中 – 将显示我想在会议期间提出的所有代码审查意见。

这里有更多的模板。

包括:

  • 从特定的date创build一个date对象
  • 创build一个新的通用ArrayList
  • logging器设置
  • 以指定的级别login
  • 创build一个新的通用HashMap
  • 遍历地图,打印键和值
  • 使用SimpleDateFormatparsing一段时间
  • 逐行读取文件
  • logging并重新抛出一个被捕获的exeption
  • 打印一段代码的执行时间
  • 创build定期计时器
  • 写一个string到文件

slf4jlogging

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

Bean属性

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

的PropertyChangeSupport

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

发布Java 7,设置需要(或优先select)对封装类的静态引用的logging器的好方法是使用新引入的MethodHandles API来获取静态上下文中的运行时类。

SLF4J的示例代码片段是:

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

除了在任何IDE中作为一个简单的代码片段,如果你将某些function重构到另一个类中,它也不那么脆弱,因为你不会不小心携带类名。

在GUI线程上调用代码

我将以下模板绑定到快捷方式slater以快速在GUI线程上分派代码。

 ${:import(javax.swing.SwingUtilities)} SwingUtilities.invokeLater(new Runnable() { @Override public void run() { ${cursor} } }); 

当使用代码进行testing时,我有时会错过删除某些系统 。 所以我创build了一个名为syt的模板。

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

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

strf -> String.format("msg", args)非常简单,但保存了一些input。

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

从当前显示获取SWT颜色:

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

与syncexec的Suround

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

使用单例devise模式:

 /** * 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; } 

和一个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); } 

logging器声明的模板非常棒。

我还创build了linfo,ldebug,lwarn,lerror,这是我经常使用的日志级别。

lerror:

 logger.error(${word_selection}${});${cursor} 

创build一个事件的一切

因为在Java中创build事件有点痛苦 – 所有这些接口,方法和东西都是为了写1个事件而写的 – 我做了一个简单的模板来创build1个事件所需的所有东西。

 ${: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); } } 

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

我已经使用通用接口和generics类写了一个很好,很less,优雅的事件机制,但是由于Java处理generics的方式,它不起作用。 =(

编辑 :1)我遇到了线程添加/删除侦听器,而事件发生的问题。 List在使用时不能被修改,所以我添加了正在访问或使用监听器列表的synchronized块,locking列表本身。

插入testing方法时,应该给予

最近我看到了一个和这个相似的版本,而且和一个非常好的开发人员和朋友进行了编程,我认为这可能是一个很好的补充。

这个模板将在一个类上创build一个新的testing方法,按照评论中的行为驱动开发 (BDD)范式的给定 – 当 – 然后的方法 ,作为构造代码的指导。 它将以“应该”开始方法名称,并让您用testing方法责任的尽可能最好的描述replace虚拟方法名称“CheckThisAndThat”的其余部分。 填写完名称后,TAB会直接转到// Given section ,因此您可以开始input前提条件。

我把它映射到三个字母“tst”,描述“testing方法应该什么时候给予”;)

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

 @Test public void should${CheckThisAndThat}() { Assert.fail("Not yet implemented"); // Given ${cursor} // When // Then }${:import(org.junit.Test, org.junit.Assert)} 

这是一个非实例类的构造函数:

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

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

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

“我…”立即鼓励开发人员描述课程的作用。 我似乎似乎改善了无证类的问题。

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

春季注射

我知道这是比较迟的游戏,但是这里是我在一个类中用于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}; } 

我有很多这些片段的使用,寻找null值和空string。

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

testNullArgument

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

您可能需要更改exception消息以符合您公司或项目的标准。 但是,我build议有一些消息,包括有问题的参数的名称。 否则你的方法的调用者将不得不查看代码来了解哪里出了问题。 (没有消息的NullPointerException会产生一个相当不合理的消息“null”的exception)。

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

您也可以重复使用上面的空检查模板,并实现这个片段来检查空string。 然后,您将使用这两个模板来生成上面的代码。

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

如果你使用了很多最终的参数,并且想要检查空string,但是不需要将它们作为代码的一部分进行修剪,那么可以使用下面的代码:

 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

我还创build了一些片段来检查不作为参数发送的variables(最大的区别是exceptiontypes,现在是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}"); } 

testArgument

这是testingvariables的通用模板。 我花了几年的时间才真正学会欣赏这一个,现在我用了很多(与上面的模板相结合!)

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

您input一个variables名称或一个返回值的条件,后跟操作数(“==”,“<”,“>”等)和另一个值或variables,如果testing失败,则结果代码将抛出IllegalArgumentException。

if语句稍微复杂的原因是,整个expression式用“!()”包装,这样可以在exception消息中重用testing条件。

也许会混淆一个同事,但只有当他们必须查看代码,如果你抛出这些例外,他们可能不需要这样做。

这是一个数组的例子:

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

通过调用模板来获得这个结果,input“from.length”[TAB]“== to.length”。

结果是比“ArrayIndexOutOfBoundsException”或类似的方式更有趣,可能实际上给你的用户一个机会来找出问题。

请享用!

我使用这个MessageFormat(使用Java 1.4)。 那样的话,我相信在进行国际化的时候,我没有难以提取的连接

国际化

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

也用于logging:

日志

 if(logger.isDebugEnabled()){ String msg = "${message}"; //NLS-1 Object[] params = {${params}}; logger.debug(MessageFormat.format(msg, params)); } 

我最喜欢的几个是…

1:Javadoc,插入有关作为Spring对象注入方法的方法的doc。

  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:debugging窗口,创buildFileOutputStream并将缓冲区的内容写入文件。 用于当你想比较一个缓冲区与过去的运行(使用BeyondCompare),或者如果你不能查看缓冲区的内容(通过检查),因为它太大…

 java.io.FileOutputStream fos = new java.io.FileOutputStream( new java.io.File("c:\\xx")); fos.write(buffer.toString().getBytes()); fos.flush(); fos.close();