Полезные шаблоны кода Eclipse Java [закрыто]

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

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

например

sysout распространяется на:

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

вы можете активировать этой введя sysout затем CTRL+SPACE

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

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

  • создать log4j logger
  • получить swt цвет с дисплея
  • Syncexec-Eclipse Framework
  • Синглтон Шаблон/Перечисление Синглтон Поколения
  • функцию ReadFile
  • Const
  • Traceout
  • Формат Строки
  • Комментарий Код Комментарий
  • строку в формате
  • Попробовать Наконец Lock
  • формат сообщения i18n и log
  • Equalsbuilder
  • Hashcodebuilder
  • Впрыска Объекта Весны
  • Создать FileOutputStream

30 ответов


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

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
}

строка

MessageFormat-окружите выделение с помощью MessageFormat.

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

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

заблокировать выбор

lock-окружите выбранные строки с помощью try finally lock. Предположим наличие переменной lock.

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

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


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

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

Шаблон Создания Синглтона: Назовите это 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();

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

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

Screenshot


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

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

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

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

Нулевые Чеки!

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

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

один из моих любимых-это 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};

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


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

throw new IllegalArgumentException(${var});

лучше

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

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

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

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

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


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

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

  • создайте объект даты из определенной даты
  • создайте новый универсальный ArrayList
  • настройки логгера
  • войти с указанным уровнем
  • создать новый универсальный HashMap
  • итерация по карте, печать ключей и значений
  • проанализировать время с помощью SimpleDateFormat
  • читать файл строка за строкой
  • Log и rethrow поймали exeption
  • время выполнения печати блока кода
  • создать периодический таймер
  • напишите строку в файл

slf4j Logging

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

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

Свойства Зерен

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

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

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

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

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


вызовите код в потоке GUI

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

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

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

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

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


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

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

получить 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;
}

и адаптация 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);
}

шаблон для объявления регистратора велик.

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

lerror:

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

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

поскольку события-это своего рода боль для создания в 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____().

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

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


вставить методы тестирования should-given-when-then

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

этот шаблон создаст новый метод тестирования для класса, следуя учитывая-Когда-тогда подход С поведение-разработки (BDD) парадигма комментариев, как руководство по структурированию кода. Это начнется имя метода С "должен" и позволяет заменить остальную часть фиктивного имени метода "CheckThisAndThat" с наилучшим возможным описанием ответственности метода тестирования. После заполнения имени, вкладка приведет вас прямо к // Given section, поэтому вы можете начать вводить предварительные условия.

я сопоставил его с тремя буквами "tst", с описанием "методы тестирования должны-заданы-когда-то";)

надеюсь, вы найдете его столь же полезным, как и я, когда увидел его:

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

    // When


    // Then

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

Весна Инъекции

Я знаю, что это поздновато для игры, но вот один, который я использую для весенней инъекции в классе:

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

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

// 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.


Я много использовал эти фрагменты, ища null значения и пустые строки.

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

testNullArgument

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

вы можете изменить сообщение об исключении в соответствии со стандартом вашей компании или проекта. Однако я рекомендую иметь некоторое сообщение, которое включает имя оскорбительного аргумента. В противном случае вызывающий ваш метод будет выглядеть в коде, чтобы понять, что пошло не так. (A 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}");
}

вы также можете повторно использовать шаблон проверки 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}");
}

testArgument

это общий шаблон для проверки переменной. Мне потребовалось несколько лет, чтобы действительно научиться ценить это, теперь я использую его много (в сочетании с вышеуказанными шаблонами, конечно!)

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

введите имя переменной или условие, которое возвращает значение, затем операнд ("==", "" etc) и другое значение или переменная, и если тест завершится неудачей, результирующий код вызовет исключение 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.длина "[TAB] " = = to.длина."

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

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


Я использую это для MessageFormat (используя Java 1.4). Таким образом, я уверен, что у меня нет конкатенаций, которые трудно извлечь при интернационализации

как i18n

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

также для входа:

log

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

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

1: Javadoc, чтобы вставить doc о методе, являющемся методом инъекции объекта 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();