Полезные шаблоны кода 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
  • Traceout
  • Формат Строки
  • Комментарий Код Комментарий
  • строку в формате
  • Попробовать Наконец Замок
  • формат сообщения i18n и log
  • Equalsbuilder
  • Hashcodebuilder
  • Впрыска Объекта Весны
  • Создать FileOutputStream
30 492

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}.acquire();
try {
    ${line_selection}
    ${cursor}
} finally {
    ${lock}.release();
}

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

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

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

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

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

Mock метод 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, он вставляет.

Throw an IllegalArgumentException with variable in current scope (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
  • читать файл строка за строкой
  • войти и повторно пойманный за исключением
  • время выполнения печати блока кода
  • создать периодический таймер
  • запись строки в файл

slf4j Logging

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

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

при тестировании с кодом я иногда пропускал удаление некоторых syso ы. Так я сделал себе шаблон под названием 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}
    }
});

используйте шаблон одноэлементного дизайна:

/**
 * 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 обрабатывает дженерики. =(

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

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

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

этот шаблон создаст новый метод тестирования для класса, следуя учитывая - когда-то подход С развитие на основе поведения (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};
}

вот это конструктор для non-instantiable классов:

// 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$
 */

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

и, конечно же, $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}");
}

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