it-swarm.com.ru

Ищите полезные шаблоны кода Eclipse Java

Вы можете создавать различные шаблоны кода Java в Eclipse через

Окно> Настройки> Java> Редактор> Шаблоны

например.

sysout расширен до:

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

Вы можете активировать это, набрав sysout, а затем CTRL+SPACE

Какие полезные Java шаблоны кода вы сейчас используете? Включите название и описание этого и почему это круто.

Я ищу оригинальное/новое использование шаблона, а не встроенную существующую функцию.

  • Создать Log4J logger
  • Получить цвет SWT с дисплея
  • Syncexec - Eclipse Framework
  • Singleton Pattern/Enum Singleton Generation
  • ReadFile
  • Const
  • Проследить
  • Формат Строка
  • Код комментария
  • Формат строки
  • Попробуй наконец заблокировать
  • Формат сообщения i18n и лог
  • Equalsbuilder
  • Hashcodebuilder
  • Инжекция пружинных объектов
  • Создать файлOutputStream
501
Jon

Следующие шаблоны кода создадут регистратор и, при необходимости, создадут правильный импорт.

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

Источник .

ИЮЛЬ

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

Некоторые дополнительные шаблоны здесь: Ссылка 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} 

UPDATE: 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
}
47
Jon

Форматировать строку

MessageFormat - окружить выделение MessageFormat.

 ${:import(Java.text.MessageFormat)} 
 MessageFormat.format(${Word_selection}, ${cursor})

Это позволяет мне переместить курсор на строку, расширить выделение до всей строки (Shift-Alt-Up), затем дважды нажать Ctrl-Space.

Блокировка выбора

заблокировать - окружить выделенные строки попыткой блокировки наконец. Предположим наличие переменной блокировки.

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

NB ${line_selection} шаблоны отображаются в меню Surround With (Alt-Shift-Z).

31
jamesh

Я знаю, что я бью мертвый пост, но хотел поделиться этим для завершения:

Правильная версия шаблона генерации синглтона, которая преодолевает ошибочную конструкцию двойной проверки блокировки (обсуждалась выше и упоминалась где-то еще)

Шаблон создания одиночного файла: Назовите это createsingleton

static enum Singleton {
    INSTANCE;

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

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


Для доступа к синглетам, сгенерированным с использованием выше:

Ссылка на шаблон Singleton: Назовите это getsingleton:

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

Добавьте фрагмент кода для итерации по 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

26
mmdemirbas

Для log - полезная маленькая песенка, которую нужно добавить в переменную-член.

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

Создайте макет с помощью Mockito (в контексте "операторов Java"):

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

И в "членах типа Java":

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

Макет пустого метода, чтобы вызвать исключение:

${: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
24
mantrid

Нулевые Проверки!

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

if( ${Word_selection} == null ){
    ${cursor}
}
23
Prashant Bhate

Один из моих любимых - foreach:

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

И traceout, так как я часто использую его для отслеживания:

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

Я просто подумал о другом и однажды нашел его в Интернете: const:

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

Небольшой совет по sysout - мне нравится переименовывать его в "sop". Ничто другое в библиотеках Java не начинается с "sop", поэтому вы можете быстро ввести "sop" и boom, он вставит.

20
Scott Stanchfield

Создайте исключение IllegalArgumentException с переменной в текущей области видимости (illarg):

throw new IllegalArgumentException(${var});

Лучше

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

Ничего особенного для производства кода - но весьма полезно для обзоров кода

У меня есть мой шаблон coderev low/med/high, сделайте следующее

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

А затем в представлении "Задачи" - покажут все комментарии к обзору кода, которые я хочу поднять во время встречи.

14
PSU_Kardi

Еще несколько шаблонов здесь .

Включает в себя:

  • Создать объект даты с определенной даты
  • Создать новый универсальный ArrayList
  • Настройка логгера
  • Вход с указанным уровнем
  • Создать новый универсальный HashMap
  • Итерация по карте, печать ключей и значений
  • Разобрать время с помощью SimpleDateFormat
  • Читать файл построчно
  • Войти и отбросить пойманную исключение
  • Время печати блока кода
  • Создать периодический таймер
  • Записать строку в файл
14
lucrussell

ведение журнала slf4j

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

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

Post Java 7, отличный способ настроить регистраторы, которым нужны (или предпочитают) статические ссылки на включающий класс, - это использовать недавно представленный API-интерфейс MethodHandles, чтобы получить класс времени выполнения в статическом контексте.

Пример фрагмента для SLF4J:

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

Помимо того, что он является простым фрагментом в любой IDE, он также менее хрупок, если вы реорганизуете определенные функции в другой класс, потому что вы не будете случайно носить имя класса с ним.

10
Timothy055

Свойство Бина

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

strf -> String.format("msg", args) довольно прост, но немного экономит время при наборе текста.

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

При тестировании кода я иногда пропускал удаление некоторых syso s. Поэтому я сделал себе шаблон под названием syt.

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

Перед компиляцией я всегда проверяю свои TODO и никогда не забуду снова удалить System.out.

9
Calon

вызывать код в потоке GUI

Я связываю следующий шаблон с ярлыком slater для быстрой отправки кода в потоке GUI.

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

Шаблон для объявления логгера отличный.

Я также создаю linfo, debug, warn, error для уровней журнала, которые я использую чаще.

lerror:

logger.error(${Word_selection}${});${cursor}
8
fgui

Получить цвет SWT из текущего дисплея:

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

Suround с syncexec

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

Используйте шаблон проектирования Singleton:

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

Вставьте методы испытаний, которые должны быть даны, когда

Недавно я видел аналогичную версию этой версии во время парного программирования с очень хорошим разработчиком и другом, и я думаю, что это может быть хорошим дополнением к этому списку.

Этот шаблон создаст новый метод тестирования в классе, следуя заданный - когда - затем подход из парадигмы управляемой поведением (BDD) комментариев, как руководство по структурированию кода. Имя метода будет начинаться со слова "следует", и вы сможете заменить оставшуюся часть фиктивного имени метода "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)}
8
MacLuq

И 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);
}
8
Jon

Создать все для события

Поскольку создавать события в Java довольно сложно - все эти интерфейсы, методы и все, что нужно написать только для одного события, - я создал простой шаблон для создания всего необходимого для одного события.

${: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 обрабатывает универсальные шаблоны. знак равно

Edit: 1) Я столкнулся с проблемой, когда потоки добавляли/удаляли слушателей, когда происходило событие. List не может быть изменено во время использования, поэтому я добавил synchronized блоки, где список слушателей доступен или используется, блокируя сам список.

8
Benny Jobigan

Spring Injection

Я знаю, что это немного поздно для игры, но вот один, который я использую для 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};
}
7
Mike Clark

Вот конструктор для неинстанцируемых классов:

// 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);
    }
}
7
David M. Coe

Я много использовал эти фрагменты, искал значения 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 или подобное, и может фактически дать вашим пользователям шанс выяснить проблему.

Наслаждайтесь!

5
Erk

Мне нравится сгенерированный комментарий класса:

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

"Я ..." немедленно побуждает разработчика описать, что делает класс. Я, кажется, улучшить проблему недокументированных классов.

И, конечно же, $ Id $ - это полезное ключевое слово CVS.

5
skaffman

Мои любимые несколько ...

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), или если вы не можете просмотреть содержимое буфера (через inspect), потому что он слишком большой ...

Java.io.FileOutputStream fos = new Java.io.FileOutputStream( new Java.io.File("c:\\x.x"));
fos.write(buffer.toString().getBytes());
fos.flush();
fos.close();
4
jeff porter
  • public int hashCode ()
  • public boolean equals (Объект)

Использование явных тестов, а не рефлексии, которая медленнее и может завершиться ошибкой в ​​диспетчере безопасности ( EqualsBuilder javadoc ).

Шаблон содержит 20 участников. Вы можете перемещаться по ним с помощью клавиши TAB. После завершения оставшиеся вызовы apppend() должны быть удалены.

${:import(org.Apache.commons.lang.builder.HashCodeBuilder, org.Apache.commons.lang.builder.EqualsBuilder)}
@Override
public int hashCode() {
    return new HashCodeBuilder()
        .append(${field1:field})
        .append(${field2:field})
        .append(${field3:field})
        .append(${field4:field})
        .append(${field5:field})
        .append(${field6:field})
        .append(${field7:field})
        .append(${field8:field})
        .append(${field9:field})
        .append(${field10:field})
        .append(${field11:field})
        .append(${field12:field})
        .append(${field13:field})
        .append(${field14:field})
        .append(${field15:field})
        .append(${field16:field})
        .append(${field17:field})
        .append(${field18:field})
        .append(${field19:field})
        .append(${field20:field})
        .toHashCode();
}

@Override
public boolean equals(Object obj) {
    if (obj == null) {
        return false;
    }
    if (obj == this) {
        return true;
    }
    if (obj.getClass() != getClass()) {
        return false;
    }
    ${enclosing_type} rhs = (${enclosing_type}) obj;
    return new EqualsBuilder()
            .append(${field1}, rhs.${field1})
            .append(${field2}, rhs.${field2})
            .append(${field3}, rhs.${field3})
            .append(${field4}, rhs.${field4})
            .append(${field5}, rhs.${field5})
            .append(${field6}, rhs.${field6})
            .append(${field7}, rhs.${field7})
            .append(${field8}, rhs.${field8})
            .append(${field9}, rhs.${field9})
            .append(${field10}, rhs.${field10})
            .append(${field11}, rhs.${field11})
            .append(${field12}, rhs.${field12})
            .append(${field13}, rhs.${field13})
            .append(${field14}, rhs.${field14})
            .append(${field15}, rhs.${field15})
            .append(${field16}, rhs.${field16})
            .append(${field17}, rhs.${field17})
            .append(${field18}, rhs.${field18})
            .append(${field19}, rhs.${field19})
            .append(${field20}, rhs.${field20})${cursor}
            .isEquals();
}
4
gswierczynski

Я использую это для 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));
}
4
Mario Ortegón

Хэмкрест-тест со статическим импортом

Вот шаблон для генерации методов @Test с необходимым импортом hamcrest, если вы хотите использовать новые функции JUnit 4.8.2 (assertThat, is, hasItems и т.д.)

@${testType:newType(org.junit.Test)}
public void ${testName}() throws Exception {
    // Arrange
    ${staticImport:importStatic('org.hamcrest.MatcherAssert.*','org.hamcrest.Matchers.*')}${cursor} 
    // Act

    // Assert

}

Я уже использовал это много раз, когда писал тест.

Что такое Arrange-Act-Assert?

3
MartinL

С помощью плагина: http://code.google.com/p/Eclipse-log-param/

Можно добавить следующий шаблон:

logger.trace("${enclosing_method}. ${formatted_method_parameters});

И получить результат:

public static void saveUserPreferences(String userName, String[] preferences) {
    logger.trace("saveUserPreferences. userName: " + userName + " preferences: " + preferences);
}
3
Andrey Rodionov

Я использую следующие шаблоны для Android разработки:

Verbose (Logv)

Log.v(TAG, ${Word_selection}${});${cursor}

Debug (Logd)

Log.d(TAG, ${Word_selection}${});${cursor}

Инфо (Логи)

Log.i(TAG, ${Word_selection}${});${cursor}

Warn (Logw)

Log.w(TAG, ${Word_selection}${});${cursor}

Ошибка (лог)

Log.e(TAG, ${Word_selection}${});${cursor}

Assert (Лога)

Log.a(TAG, ${Word_selection}${});${cursor}

TAG - это константа, которую я определяю в каждом действии.

3
Terel

Это берет на себя большую часть трудоемкой печати/регистрации локальных значений. Он автоматически захватывает имя переменной в строке. Это экономит много времени при наборе текста и исправлении опечаток.

Шаблон:

+ ", ${1:var}: " + ${1:var}

У него есть две ловушки:

Хотя вам предлагается выбрать локальное/параметр/поле, это не включает примитивы :(

Подсказка возникает чаще всего всякий раз, когда код компилируется без ошибок. Часто использование этого макроса приводит к временно нарушенному синтаксису, поэтому для вставки нескольких переменных требуется некоторое жонглирование. Ничего похожего на удобство отсутствия опечаток в именах переменных.

2
Terry

Я только что заметил, что @Duncan Jones уже имеет этот шаблон, но добавляет ${line_selection} и использует Shift + Alt + Z это полезная тактика.

Это может быть полезно только как хакерское исправление плохого дизайна в проекте, над которым я работаю, но у меня много ситуаций, когда какой-то устаревший код модифицирует компоненты Swing из потока AWT и вызывает периодически возникающие ошибки, поэтому чтобы быстро исправить это, я использую:

${:import(javax.swing.SwingUtilities)}
// Ensure that any Swing components will be invoked only from the AWT thread
SwingUtilities.invokeLater(new Runnable() {

    @Override
    public void run() {
        ${line_selection}${cursor}
    }
});

Так что я могу выделить оскорбительные высказывания и использовать Shift + Alt + Z окружать. Я называю этот шаблон swinvoke.

2
dassimon

Вот foreach, который будет работать для итерации по List<Stuff>. Необязательный контент внутри цикла предназначен для поиска элемента в списке и его возврата.

for (${t:elemType(w)} elem: ${w:collection}) {
    if (elem.get.equals(${localVar})){
        return elem;
    }
}
return null;
1
Manu de Hanoi

Шаблоны EasyMock

Создать макет

${:importStatic(org.easymock.EasyMock.createMock)}
${type} ${name} = createMock(${type}.class);

Сбросить макет

${:importStatic(org.easymock.EasyMock.reset)}
reset(${var});

Replay Mock

${:importStatic(org.easymock.EasyMock.replay)}
replay(${var});

Проверить макет

${:importStatic(org.easymock.EasyMock.verify)}
verify(${var});
1
Brent Worden

Создайте новый JUnit контрольный пример из выбранного Word:

Для этого нужен регистратор (называемый _logger: для этого также есть очень хороший шаблон).

Я большой поклонник этого шаблона, потому что мне очень легко быстро создавать невыполненные контрольные примеры, как только я подумаю о них. Они будут сидеть там без меня, как напоминание о деле, которое мне нужно проверить.

${:import(org.junit.Test, org.junit.Assert)}
    @Test
    public void fooTest() throws Throwable {
        try {
            ${cursor}
            Assert.fail("Not Implemented");
        } catch (Throwable e) {
            _logger.error("Failed test", e);
            throw e;
        }
    }

Чтобы использовать его, введите имя контрольного примера (скажем, testSerializeObject), выделите Word и нажмите Ctrl + Space (или что вы настроили для помощи с кодом).

Мой любимый шаблон для тестового случая - тот, который регистрирует исключения и затем перебрасывает их, так как мне нравится видеть исключения в консоли, а не в средстве просмотра исключений JUnit.

Если вы предпочитаете System.out в своих тестах, а не файлы журналов, вы всегда можете использовать что-то подобное:

${:import(org.junit.Test, org.junit.Assert)}
@Test
public void ${Word_selection}() throws Exception {
    try {
        ${cursor}
        Assert.fail("Not Implemented");
    } catch (Exception e) {
        System.out.println("Failed test");
        e.printStackTrace();
        throw e;
    }
}
1
Mason Bryant

Кодовый раздел

//--------------------------------------------------------------
//                       ${title}
//--------------------------------------------------------------
${cursor}

Используйте этот шаблон, чтобы упростить комментирование разделов кода. это не очень сложно, но сэкономило мне много времени :)

1
coderatchet

Класс внутреннего слушателя для разработки SWT и плагинов:

${imports:import(org.Eclipse.swt.widgets.Listener)}
private class ${className} implements Listener{

    @Override
    public void handleEvent(Event e) {
        final Widget w = e.widget;
    }
}
0
tekkavi

list_methods - генерирует методы для добавления, удаления, подсчета и содержит для списка

public void add${listname}(${listtype} toAdd){
    get${listname}s().add(toAdd);
}

public void remove${listname}(${listtype} toRemove){
    get${listname}s().remove(toRemove);
}

public ${listtype} get${listname}(int index){
    return get${listname}s().get(index);
}

public int get${listname}Count(){
    return get${listname}s().size();
}

public boolean contains${listname}(${listtype} toFind){
    return get${listname}s().contains(toFind);
}

${cursor}

id - вставляет аннотации, импорт, поле и получатель для простого JPA @Id

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

public Long getId(){
    return id;
}

${cursor}
${:import (javax.persistence.GenerationType,javax.persistence.GeneratedValue,javax.persistence.Id)}
0
Stephen Erdman

Я видел ответ для шаблона, создающего базовый тестовый класс, и вот несколько отдельных вызовов, если вы предпочитаете этот подход:

Создать метод setUp с помощью @Before import

${:import(org.junit.Before)}
@Before
public final void setUp() {
  ${cursor}
}

Создать новый метод тестирования с помощью @Test import

${:import(org.junit.Test)}
@Test
public final void test${newName} () {
${cursor}
}

Я использую следующее для помощи в преобразованиях JAXB между типами и DTO :

Шаблон для преобразования существующей переменной в тип возвращаемого значения (работает с параметром)

${return_type} ${name} = null;

if (${var} != null) {
    ${name} = new ${return_type}();
    ${cursor}
}
return ${name};
0
Gaʀʀʏ

Вектор в массив

${array_type}[] ${v:var(Vector)}Array = new ${array_type}[${v}.size()];
${v}.copyInto(${v}Array);
0
aeracode

Новый метод тестирования JUnit:

 @${testType:newType(org.junit.Test)}
 public void ${testname}() throws Exception {
     ${staticImport:importStatic('org.junit.Assert.*')}${cursor}

     String expected = "" ;
     String actual = "" ;

     Assert.assertEquals(expected, actual);
}
0
Burhan ARAS

Это печатает весь объект (предполагается, что вы уже инициировали объект LOG4ER log4j):

  ${:import(org.codehaus.jackson.map.ObjectMapper)}
  // If check to avoid argument evaluation costs
  if (LOGGER.isDebugEnabled()) {
        try {
            LOGGER.debug("Object ${Object}: " + "\n"
                + new ObjectMapper().writeValueAsString(${Object}));
        } catch (JsonGenerationException e) {
            LOGGER.info(e.toString());
        } catch (JsonMappingException e) {
            LOGGER.info(e.toString());
        } catch (IOException e) {
            LOGGER.info(e.toString());
        }
  }
0
Gautam