Вопрос по java, code-generation, ide, templates, eclipse – Полезные шаблоны Java-кода Eclipse [закрыто]

498

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

Window > Preferences > Java > Editor > Templates

например

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

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

Вы можете активировать это, набравsysout с последующимCTRL+SPACE

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

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

Create Log4J logger Get swt color from display Syncexec - Eclipse Framework Singleton Pattern/Enum Singleton Generation Readfile Const Traceout Format String Comment Code Review String format Try Finally Lock Message Format i18n and log Equalsbuilder Hashcodebuilder Spring Object Injection Create FileOutputStream
Есть ли какие-либо, которые генерируют оператор switch из Enum со всеми возможными случаями? Я знаю, что вы можете сделать это с помощью CTRL + 1, но я бы предпочел использовать завершение cmd. GreenKiwi
Вы выделяете нужное слово, окруженное вызовом sysout, и нажимаете Ctrl-Space (затем вводите имя шаблона, если у вас есть много шаблонов с подсветкой) JReader
Можете ли вы объяснить, чтоSystem.out.println(${word_selection}${});${cursor} средства? Похоже, есть способ выбрать слово и автоматически заключить его вsysout позвони, я прав? Как? CodyBugstein
@JReader, что делает $ {}? Roland

Ваш Ответ

30   ответов
23
Null Checks!
if( ${word_selection} != null ){
    ${cursor}
}

if( ${word_selection} == null ){
    ${cursor}
}
PreConditions.checkNotNull(...) метод в Гуаве является очень удобочитаемой альтернативой (особенно при статическом импорте)
Лучше всего сначала проверить наличие нуля (== null), прежде чем проверять наличие ненулевого значения.
9

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

Я использую эту версию:String.format(${word_selection}${},)${cursor}сначала выберите строку, затем используйте «sf»; в теме. Добавьте% s и так далее ...
я используюString.format("${string}",${objects}) потому что Eclipse позволяет мне переключаться между моей строкой и моим списком объектов.
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));
}
14

Вот.

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

Create a date object from a particular date Create a new generic ArrayList Logger setup Log with specified level Create a new generic HashMap Iterate through a map, print the keys and values Parse a time using SimpleDateFormat Read a file line by line Log and rethrow a caught exeption Print execution time of a block of code Create periodic Timer Write a String to a file
Ссылка мертва ...
добавлена обратная связь с машиной
8

${: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);
}
Для решения без размышлений см. Мой ответ нижеlink
10

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

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

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

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

9

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

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

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

7

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

Invoke code on the GUI thread

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

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

Bean 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);
}
8
Create everything for an event

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

${: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) I ran into the issue where threads were adding/removing listeners while an event was taking place. The List не могут быть изменены во время использования, поэтому я добавилsynchronized блокирует доступ или использование списка слушателей, блокируя сам список.

Использовать
Отправка событий, когда они находятся в замке (синхронизированном или ином), - это тупик, ожидающий возникновения. В этом случае было бы лучше скопировать слушателей, находясь в синхронизированном блоке и повторяя новый список.
26

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

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

Singleton Creation Template: Назовите этоcreatesingleton

static enum Singleton {
    INSTANCE;

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

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


Чтобы получить доступ к синглетам, сгенерированным выше:

Singleton reference Template: Назовите этоgetsingleton:

${type} ${newName} = ${type}.Singleton.INSTANCE.getSingleton();
Когда я создаю это как часть класса (вложенное перечисление в классе), я получаю имя класса как${enclosing_type} - предназначена ?
Если вы хотите использовать это для создания перечисления${primary_type_name} пример:public enum ${primary_type_name} { INSTANCE; private ${return_type} ${name} = new ${return_type}(); public ${return_type} ${getName}(${}) { return ${name}; } ${cursor} }
@ Mr_and_Mrs_D, я думаю, что в этом суть. Вы получаете единственный экземпляр класса, в который вы помещаете этот шаблон. Теперь все, что вам нужно сделать, это сделать конструкторы закрытого типа закрытыми и иметь довольно безопасный генератор синглтона.
Он не мертвый, это вики сообщества, поэтому имеет смысл добавлять к нему больше шаблонов по мере их нахождения. На самом деле не существует исчерпывающего набора таких возможностей ... Jon
Джон, промежуток времени между предыдущим постом и моим постом составлял почти 8 месяцев, вот что заставило это процитировать. Я не могу сформулировать это лучше, чем ваш комментарий :)
24

${: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
Вы можете проверить, был ли запущен регистратор в случае обнаружения исключения (сценарий сбоя). это особенно полезно, если вы не намереваетесь отбросить его, но хотите заявить, что его не игнорируют.
Мне любопытно: зачем вам издеваться над регистратором?
4

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

null значения и пустые строки.

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

testNullArgument

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

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

Вы вводите имя переменной или условие, которое возвращает значение, за которым следует операнд (& quot; == & quot; & lt; & quot; & quot; & gt; & gt; & quot; и т. Д.) И другое значение или переменную, а также в случае сбоя теста результирующий код генерирует исключение IllegalArgumentException.

Причина слегка усложненного предложения if, когда все выражение заключено в & quot;! () & Quot; позволяет повторно использовать условие теста в сообщении об исключении.

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

Вот пример с массивами:

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

Вы получите этот результат, вызвав шаблон, набрав & quot; from.length & quot; [TAB] & quot; == to.length & quot ;.

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

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

21

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};
const доступен в качестве стандартного ассистента кода как static_final (не уверен, когда он был добавлен)
вашtraceout уже доступен в Eclipse какsystrace.
foreach доступен в качестве стандартного помощника по коду в Eclipse, я не вижу, чтобы ваш шаблон делал что-то дополнительно к стандартной версии
Хорошо, я хочу верить, что теперь в Eclipse он появляется из-за этого вопроса.
Правильно, а sysout - очень инновационный шаблон. Вопрос касался полезных шаблонов, которые мы используем.
31
Format a string

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

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

Lock the selection

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

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

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

Я использую этот в сочетании с инструкциями журнала: logger.info (MessageFormat.format ($ {word_selection}, $ {cursor});
Методы получения и освобождения замков называютсяlock а такжеunlock. acquire а такжеrelease используются для семафоров иtheir use within a try-finally block is not as strongly advised as with locks.
14

в кода

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

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

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

26

Map.entrySet():

Template:
${: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}
}
Generated Code:
for (Entry<String, String> entry : properties.entrySet())
{
    String key = entry.getKey();
    String value = entry.getValue();
    |
}

Screenshot

Как и ваш рисунок, он показывает, что вы можете использовать переменную в${} и что вместо${cursor}, включает & quot; итерацию вкладки & quot; между полями. Благодарю.
47

Некоторые дополнительные шаблоны здесь:Ссылка 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
}
я думаю, что для этого есть метод :)
Да, вы должны использовать служебный метод для чтения файла вместо вставки блоков кода. Напишите метод самостоятельно или используйте Apache commons-io IOUtils. Тем не менее, если вы создаете много одноразовых проектов с разными путями классов, может быть затруднительно добавить JAR или ссылку в свой служебный класс просто для чтения файла. Иногда вам просто нужно написать какой-нибудь одноразовый код, который читает файл, и продолжить свою жизнь.
служебный метод или прямое вставление блока кода в ваши собственные методы, в любом случае, вы все еще делаете это. если вы этого не сделаете, вы нарушаете некоторые основные принципы безопасного программирования. риск утечки ресурсов и т. д. Итак, вы создаете функцию чтения файла, а затем вам нужно написать ее ... этот шаблон сделает это за вас. Я не вижу актуальности критики шаблона и того, как шаблон применяется к технике реализации.
Э-э, я думаю, вы упустили из виду ... говоря, что я на самом деле не знаю, в чем ваша цель ... речь идет о генерации кода, а не модульности ... Jon
Я думаю, дело в том, что добавление такого большого количества кода в шаблон является программированием «вырезать и вставить» для очень распространенной ситуации.
411

при необходимости, создадут правильный импорт.

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());
Я люблю это! Но я поместил $ {import ...} ниже объявления Logger, чтобы он не добавлял новую строку.
Не в моей версии (3.5) тоже. Кто-нибудь знает, в какой версии он был представлен?
@TMS - добавлено, спасибо!
Я думаю, что $ {: import ...} работает только в новых версиях Eclipse. Я застрял с 3.2, и он не работает для меня.
Здорово. Я не знал о $ {: import ...} чтоли.
20

Ничто другое в java-библиотеках не начинается с & quot; sop & quot; так что вы можете быстро набрать & quot; sop & quot; и бум, он вставляет.

После «Затмения Марса» плохой шаг назад на ярлыке"syso" + Ctrl + Space: в нем будут перечислены некоторые классы, в имени которых есть символы s, y, s и o (из-за нового поиска CamelCase). Итак, теперь вы должны дополнительно выбратьsysout из списка и нажмите Return.
По умолчанию просто набираюsyso будет делать так же, как sysout.
Побить тебя на 25% с помощью соп, хотя ...;)
8
Insert test methods should-given-when-then

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

Этот шаблон создаст новый метод тестирования в классе, следуяДано - Когда - Тогда подход отповеденческое развитие (BDD) парадигма комментариев, как руководство для структурирования кода. Имя метода будет начинаться со слова «следует»; и пусть вы замените оставшуюся часть имени фиктивного метода & quot; CheckThisAndThat & quot; с наилучшим возможным описанием ответственности метода испытаний. После заполнения имени, 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)}
Мне нравится этот шаблон. Я добавил исключение "throws" чтобы немного облегчить тестирование.
Мне нравится парадигма BDD. Очень хороший шаблон для этого. И просто примечание: ваш очень хороший разработчик и друг ушел!
5

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

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

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

8

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;
}
Привет, Паблоджим, С тех пор как я опубликовал этот шаблон, я начал читать Effective Java и изменил свои реализации синглетонов на enum. Тем не менее я не нашел способа, чтобы шаблон генерировал перечисление и, таким образом, модифицировал объявление класса. У вас есть этот шаблон? Спасибо Ману
К вашему сведению: здесь шаблон синглтона enumelectrotek.wordpress.com/2008/08/06/…, Мне это особенно не нравится, но тогда у меня не так много одиночных игр. Это легко превратить в шаблон Java.
Просто небольшое замечание. Согласно Маэстро, известному как Джошуа Блох, использование Enum должно быть предпочтительным методом для создания синглетонов в Java.
Сериализуемый? Да. Рассмотрим сериализацию объекта со ссылкой на ваш синглтон. Если он не Serializable, то вы можете столкнуться с NPE. Если это так (и вы не добавляете методы для перезаписи десериализации по умолчанию), то вы можете получить другой экземпляр вашего «Singleton».
Для подхода enum я надеюсь, что все ваши синглтоны имеют смысл как сравниваемые, сериализуемые объекты, потому что многие синглтоны не имеют (и он задается вопросом, почему этот «... подход» еще не получил широкого распространения »- потому что сопоставимость и сериализация не имеет смысла для некоторых синглтон-классов!)
17

ласти видимости (illarg):

throw new IllegalArgumentException(${var});

Лучше

throw new IllegalArgumentException("Invalid ${var} " + ${var});  
11
slf4j Logging
${imp:import(org.slf4j.Logger,org.slf4j.LoggerFactory)}

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

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

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

private static Log log = LogFactory.getLog(${enclosing_type}.class);
Для записи в файл журнала вручную: $ {: import (java.io.PrintWriter, java.io.BufferedWriter, java.io.FileWriter)} try {PrintWriter out = new PrintWriter (новый BufferedWriter (новый FileWriter ($ {logFile: var (String)}, true))); out.println ($ {лаглинь: вар (String)} $ {курсор}); out.close (); } catch (IOException e) {/ * TODO: обработка исключений * / e.printStackTrace (); }
8

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

lerror:

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

Похожие вопросы