有用的Eclipse Java代碼模板




templates ide (20)

您可以在Eclipse中通過創建各種Java代碼模板

窗口>首選項> Java>編輯器>模板

例如

sysout被擴展為:

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

你可以通過輸入sysout然後按CTRL+SPACE來激活它

你目前使用哪些有用的Java代碼模板?
包括它的名稱和描述以及為什麼它很棒。

對於原始/新穎的模板使用而不是內置的現有功能,有一個開放的賞金。

  • 創建Log4J記錄器
  • 顯示swt顏色
  • Syncexec - Eclipse框架
  • 單例模式/枚舉單例生成
  • READFILE
  • 常量
  • Traceout
  • 格式字符串
  • 評論代碼審查
  • 字符串格式
  • 試試最後鎖定
  • 消息格式i18n和日誌
  • Equalsbuilder
  • Hashcodebuilder
  • Spring對象注入
  • 創建FileOutputStream

slf4j記錄

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

private static final Logger LOGGER = LoggerFactory
    .getLogger(${enclosing_type}.class);

插入測試方法應該什麼時候應該

最近我看到了一個和這個版本類似的版本,與一個非常優秀的開發人員和朋友結對編程,我認為這可能是這個列表的一個很好的補充。

這個模板將在一個類上創建一個新的測試方法,按照評論中行為驅動開發 (BDD)範式的Given-When-Then方法 ,作為構造代碼的指導。 它將以“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)}

為活動創建一切

由於事件對於用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);
    }
}

如果您有共享單個EventObject事件,只需刪除模板插入的自定義事件,並更改raise___()on____()的相應部分。

我使用通用接口和泛型類編寫了一個很好的,優雅的事件機制,但由於Java處理泛型的方式,它不起作用。 =(

編輯 :1)我遇到了線程添加/刪除偵聽器,而事件發生的問題。 該List在使用時不能被修改,所以我添加了正在訪問或使用監聽器列表的synchronized塊,鎖定列表本身。


空檢查!

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

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

strf -> String.format("msg", args)非常簡單,但保存了一些輸入。

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

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

春季注射

我知道這是比較遲的遊戲,但這裡是我在課堂上用於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};
}

代碼生成沒什麼奇怪 - 但對代碼評論非常有用

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

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

然後在任務視圖中 - 將顯示我想在會議期間提出的所有代碼審查意見。


如果需要,以下代碼模板將創建一個記錄器並創建正確的導入。

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

Source

JUL

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

將當前作用域(illarg)中的變量拋出IllegalArgumentException:

throw new IllegalArgumentException(${var});

更好

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

從當前顯示中獲取SWT顏色:

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

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

我喜歡這樣的生成類的評論:

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

“我......”立即鼓勵開發人員描述課程內容。 我確實似乎改善了無證類的問題。

當然,$ Id $是一個有用的CVS關鍵字。


我最喜歡的幾個是......

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:調試窗口,創建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();

我有很多這些片段的使用,尋找null值和空字符串。

我使用“參數測試”模板作為我的方法中的第一個代碼來檢查收到的參數。

testNullArgument

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

您可能需要更改異常消息以符合您公司或項目的標準。 但是,我建議有一些消息包含有問題的參數的名稱。 否則,您的方法的調用者將不得不查看代碼以了解哪裡出了問題。 (沒有消息的NullPointerException會產生一個具有相當無意義消息“null”的異常)。

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

您也可以重複使用上面的空檢查模板,並實現此片段以僅檢查空字符串。 然後,您將使用這兩個模板來生成上述代碼。

然而,上面的模板有一個問題,如果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}");
}

testArgument

這是測試變量的通用模板。 我花了幾年的時間才真正學會欣賞這一個,現在我用了很多(結合上面的模板當然!)

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”或類似的方式更有趣,可能實際上給你的用戶一個機會來找出問題。

請享用!


我知道我正在踢死一個帖子,但為了完成,我想分享一下:

單一代生成模板的正確版本,它克服了有缺陷的雙重檢查鎖定設計(上面討論過並在其他地方提到過)

單身人士創造模板:將此命名為單人

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

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

模擬一個無效的方法來做一些事情:

${: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的新鏈接列表(以及類似的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

發布Java 7,設置需要(或優先選擇)對封閉類的靜態引用的記錄器的好方法是使用新引入的MethodHandles API來獲取靜態上下文中的運行時類。

SLF4J的示例代碼片段是:

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

除了在任何IDE中作為一個簡單的代碼片段,如果將某些功能重構到另一個類中,它也不那麼脆弱,因為您不會意外地攜帶類名稱。


記錄器聲明的模板非常好。

我還創建了linfo,ldebug,lwarn,lerror,以便更頻繁地使用日誌級別。

lerror:

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

這裡有一些額外的模板: 鏈接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
}

關於sysout的一點小技巧 - 我喜歡將它重命名為“sop”。 java庫中沒有其他的東西以“sop”開頭,所以你可以快速輸入“sop”和繁榮,它會插入。





code-generation