有用的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();