Шукаю корисні шаблони коду Java Eclipse [закрито]


517

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

Вікно> Налаштування> Java> Редактор> Шаблони

напр

sysout розширено до:

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

Ви можете активувати це, ввівши sysoutдаліCTRL+SPACE

Які корисні шаблони коду Java ви зараз використовуєте? Включіть назву та опис цього і чому це приголомшливо.

Я шукаю оригінальне / нове використання шаблону, а не вбудовану існуючу функцію.

  • Створіть Log4J реєстратор
  • Отримайте яскравий колір з дисплея
  • Syncexec - Eclipse Framework
  • Singleton Pattern / Enum Singleton Generation
  • Файл читання
  • Конст
  • Трейсінг
  • Формат рядка
  • Огляд коду коментаря
  • Формат рядків
  • Спробуйте нарешті заблокувати
  • Формат повідомлення i18n та журнал
  • Рівнобудівник
  • Hashcodebuilder
  • Весна впорскування об'єкта
  • Створіть FileOutputStream

5
Чи є такі, що генерують оператор переключення від Enum з усіма можливими випадками? Я знаю, що ви можете це зробити за допомогою CTRL + 1, але я скоріше використовую завершення cmd.
— GreenKiwi

4
Чи можете ви пояснити, що System.out.println(${word_selection}${});${cursor}означає? Це здається, що є спосіб вибрати слово і автоматично вкласти його в sysoutдзвінок, я прав? Як?
— CodyBugstein

3
ви виділяєте потрібне слово, оточене викликом системи та натискаєте клавішу Ctrl-Space (потім набираєте ім'я шаблону, якщо у вас є багато шаблонів, що знають про виділення)
— JReader

@JReader, що робить $ {}?
— Роланд

Відповіді:


423

Наступні шаблони коду будуть створювати реєстратор та створювати потрібний імпорт, якщо це потрібно.

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

31
Класно. Я не знав про речі $ {: import ...}.
— JesperE

3
Я думаю, що $ {: import ...} працює лише в новіших версіях Eclipse. Я застряг з 3.2, і це не працює для мене.
— Адам Крум

Не в моїй версії (3.5). Хтось знає, в якій версії він був представлений?
— finnw

5
Я це люблю! Але я ставлю $ {import ...} під декларацією Logger, щоб він не додав новий рядок.
— Даріо Сейдл

1
@TMS - додано, дякую!
— Роберт Мунтяну

49

Деякі додаткові шаблони тут: Посилання I - Посилання II

Мені подобається цей:

файл читання

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

48
Я думаю, що це метод для :)
— benmmurphy

3
Помилка, я думаю, що ви пропустили суть ... сказавши, що я насправді не знаю, в чому ваша справа ... йдеться про генерацію коду, а не про модульність ...
— Jon

20
Я думаю, що сенс полягає в тому, що додавання цього великого коду до шаблону є програмою "вирізати та вставити" для дуже поширеної ситуації.
— Скотт Макінтайр

5
Так, ви повинні використовувати корисний метод для читання файлу замість вставки блоків коду. Напишіть метод самостійно або використовуйте Apache commons-io IOUtils. Тим не менш, якщо ви робите багато проектів, що викидаються, з різними класовими маршрутами, можна просто додати JAR або посилання у своєму класі корисності, щоб прочитати файл. Іноді просто потрібно написати якийсь викинутий код, який читає файл, і продовжувати своє життя.
— Майк Кларк

1
У Java 7 віддайте перевагу StandardCharsets.UTF_8над Charset.forName("UTF-8").
— Майк Кларк

33

Відформатуйте рядок

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

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


Я використовую цей у поєднанні із виписками журналу: logger.info (MessageFormat.format ($ {word_selection}, $ {cursor});
— П'єр Генрі

Методи придбання та звільнення замків називаються lockі unlock. acquireі releaseвикористовуються для семафорів, і їх використання в блоці спробувати не рекомендується настільки настійно, як при замках .
— Марко Лацкович

Ctrl + Space двічі, здається, більше не працює, відкриває шаблони SWT. Чи є заміна?
— Ноумен

28

Я знаю, що я кидаю мертву посаду, але хотів поділитися цим заради завершення:

Правильна версія шаблону генерації одиночного шаблону, що долає хибну подвійну перевірку блокувальної конструкції (обговорювалося вище та згадується ще де)

Шаблон створення одиночної форми: Назвіть це ім’я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();

4
Він не мертвий, це вікі спільноти, тому є сенс додати до нього більше шаблонів, коли ви їх знайдете. Немає десь ще вичерпного набору ...
— Джон

Джон, часовий розрив між попередньою посадою та моєю посадою становив майже 8 місяців, ось що змусило це процитувати. Я не міг
— сформулювати

Коли я створюю це як частину класу (вкладеного перерахунку в класі), я отримую назву класу як ${enclosing_type}- за призначенням?
— Mr_and_Mrs_D

1
@Mr_and_Mrs_D, я думаю, в цьому справа. Ви отримуєте однотонний екземпляр класу, в який ви помістили цей шаблон. Тепер все, що вам потрібно зробити, - це зробити приватні конструктори типу приватного типу та мати досить безпечний генератор однодонів.
— Майк Адлер

Якщо ви хочете скористатися цим для створення ${primary_type_name}прикладу використання перерахунків :public enum ${primary_type_name} { INSTANCE; private ${return_type} ${name} = new ${return_type}(); public ${return_type} ${getName}(${}) { return ${name}; } ${cursor} }
— Robert Smit

28

Додайте фрагмент коду до повторення 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();
    |
}

Знімок екрана


1
Як і на вашому зображенні, він показує, що ви можете використовувати змінну в ${}і замість того ${cursor}, що дозволяє "ітерація вкладки" між полями. Дякую.
— WesternGun

25

Бо logкорисна маленька принада, яку слід додати до змінної члена.

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

Для запису у файл журналу вручну: $ {: import (java.io.PrintWriter, java.io.BufferedWriter, java.io.FileWriter)} спробуйте {PrintWriter out = new PrintWriter (новий BufferedWriter (новий FileWriter ($ {logFile: var (String)}, true))); out.println ($ {logLine: var (String)} $ {cursor}); out.close (); } catch (IOException e) {/ * TODO: обробка виключень * / e.printStackTrace (); }
— Джек Міллер

24

Створіть макет із 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 (і подібний для хеш-версії та хешмапу):

${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

1
Мені цікаво: навіщо вам знущатися з лісоруба?
— Володимир Сізіков

6
ви можете перевірити, чи був викликаний насмішений реєстратор, якщо випадок вилучений (сценарій відмови). це особливо корисно, якщо ви не збираєтесь його повторно скинути, але хочете стверджувати, що це не мовчки ігнорується.
— мантрид

23

Нульові перевірки!

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

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

PreConditions.checkNotNull(...)Метод гуави є дуже читається альтернативою (особливо при статичному імпорті)
— Турбьерн Равн Андерсен

Найкраще спочатку перевірити наявність null (== null), перш ніж перевірити, чи не null.
— KrishPrabakar

21

Один з моїх коханих - це проповідь :

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

І трасування , оскільки я дуже використовую його для відстеження:

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

Я просто подумав про ще один і знайшов його через Інтернет в якийсь день, const :

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

11
foreach доступний як стандартна допомога з кодом у Eclipse, я не бачу, що ваш шаблон робить щось додаткове до стандартної версії
— Rich Seller

4
Правильно, і sysout - це дуже інноваційний шаблон. Питання стосувалося корисних шаблонів, які ми використовуємо.
— Артем Баргер

4
ваш traceoutуже доступний у Eclipse як systrace.
— dogbane

7
Приємно, я хочу вірити, що він з'являється зараз у Eclipse через це питання.
— Артем Баргер

const доступний як стандартна допомога з кодом як static_final (не впевнений, коли він був доданий)
— Арман

20

Маленька порада щодо sysout - я люблю перейменовувати її на "sop". Ніщо інше в java libs не починається з "sop", тому ви можете швидко набрати "sop" і boom, він вставляється.


11
За замовчуванням просто набравши syso, буде виконано так само, як і sysout.
— MasterScrat

9
Побийте вас на 25% сопом, хоча ...;)
— Скотт Стенчфілд

2
Оскільки Eclipse Mars є слабким кроком назад на ярлику "syso" + Ctrl + пробіл : у ньому будуть перераховані деякі класи, у яких імена символів s, y, s та o (через нове знаходження CamelCase). Отже, тепер вам доведеться додатково обрати sysout зі списку і натиснути Return.
— боббел

17

Викиньте IllegalArgumentException зі змінною в поточному обсязі (illarg):

throw new IllegalArgumentException(${var});

Краще

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

14

Нічого фантазії для виготовлення коду - але досить корисно для огляду коду

У мене є шаблон coderev low / med / high зробити наступне

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

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


14

Ще кілька шаблонів тут .

Включає:

  • Створіть об’єкт дати з певної дати
  • Створіть новий загальний ArrayList
  • Налаштування журналу
  • Журнал із заданим рівнем
  • Створіть новий загальний HashMap
  • Повторіть карту, роздрукуйте ключі та значення
  • Розбирайте час за допомогою SimpleDateFormat
  • Прочитайте файл за рядком
  • Увійдіть і повторно скиньте спіймане вилучення
  • Час виконання друку блоку коду
  • Створіть періодичний таймер
  • Напишіть рядок у файл

додано зворотне посилання на машину
— березівський

12

slf4j Лісозаготівля

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

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

10

Бін власності

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

Опублікувати Java 7, чудовий спосіб налаштування реєстраторів, які потребують (або віддають перевагу) статичні посилання на клас, що вкладається, - це використання щойно введеного API MethodHandles для отримання класу виконання в статичному контексті.

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

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

Окрім простого фрагмента в будь-якому IDE, він також менш крихкий, якщо ви перетворюєте певну функціональність в інший клас, оскільки випадково не будете носити назву класу.


9

Код виклику в потоці GUI

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

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

9

Під час тестування з кодом я іноді пропускав видалення деяких syso s. Тому я зробив собі шаблон під назвою syt .

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

Перш ніж компілювати, я завжди перевіряю свої TODO і ніколи не забуду видалити System.out знову.


9

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

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

6
Я використовую, String.format("${string}",${objects})тому що Eclipse дозволяє мені переходити між рядком і моїм списком об'єктів.
— Дункан Джонс

Я використовую цю версію: String.format(${word_selection}${},)${cursor}спочатку виберіть рядок, а потім використовуйте на ньому 'sf'. Додайте% s і так далі ...
— Крістоф Руссі

8

Отримати колір SWT з поточного дисплея:

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

Сурма з синцексеком

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

3
Лише коротка примітка - За словами Maestro, відомого як Джошуа Блох, використання Enum має бути кращим методом створення одиночних клавіш на Java.
— Паблохім

Привіт Pablojim, Оскільки я опублікував цей шаблон, я починаю читати Ефективну Java, і я змінив мої реалізації singletons на перерахунок. Тим не менш, я не знайшов способу створити шаблон, що генерує перерахунок, і таким чином змінити декларацію класу. У вас є цей шаблон? Дякую Ману
— Мануель Сельва

FYI: Ось перерахування Сінглтон шаблон electrotek.wordpress.com/2008/08/06 / ... . Мені це не подобається, але тоді я не маю багато одинаків. Перетворити це на шаблон Java легко.
— pjp

1
Щодо підходу до перерахунку, я сподіваюсь, що всі ваші синглтони мають сенс порівняльних, серіалізаційних об'єктів, тому що багато одинаків не роблять (і він цікавиться, чому цей "... підхід ще широко прийнятий" - тому що порівнянність і серіалізація не відповідають Не
— маю

Серіалізація? Так. Розгляньте серіалізацію Об’єкта з посиланням на ваш Singleton. Якщо це не серіалізується, то ви можете зіткнутися з NPE. Якщо це так (і ви не додаєте способів замінити десеріалізацію за замовчуванням), ви можете отримати інший екземпляр свого "Singleton".
— Йоганнес Кун

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

Для рішення без роздумів дивіться мою відповідь нижче за посиланням
— gswierczynski

8

Шаблон для декларації реєстратора чудовий.

Я також створюю linfo, ldebug, lwarn, lerror для рівнів журналів, якими я частіше користуюся.

леррор:

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

8

Створіть усе для події

Оскільки події своєрідно болять у створенні Java - усі ці інтерфейси, методи та інше писати лише на одну подію - я створив простий шаблон для створення всього необхідного для 1 події.

${:import(java.util.List, java.util.LinkedList, java.util.EventListener, java.util.EventObject)}

private final List<${eventname}Listener> ${eventname}Listeners = new LinkedList<${eventname}Listener>();

public final void add${eventname}Listener(${eventname}Listener listener)
{
    synchronized(${eventname}Listeners) {
        ${eventname}Listeners.add(listener);
    }
}

public final void remove${eventname}Listener(${eventname}Listener listener)
{
    synchronized(${eventname}Listeners) {
        ${eventname}Listeners.remove(listener);
    }
}

private void raise${eventname}Event(${eventname}Args args)
{
    synchronized(${eventname}Listeners) {
        for(${eventname}Listener listener : ${eventname}Listeners)
            listener.on${eventname}(args);
    }
}

public interface ${eventname}Listener extends EventListener
{
    public void on${eventname}(${eventname}Args args);
}

public class ${eventname}Args extends EventObject
{
    public ${eventname}Args(Object source${cursor})
    {
        super(source);
    }
}

Якщо у вас є події, які мають спільний доступ до одного EventObject, просто видаліть налаштований один із шаблонів і змініть відповідні частини raise___()та on____().

Я написав чудовий, маленький, елегантний механізм подій, використовуючи загальний інтерфейс та загальний клас, але це не спрацювало через те, як Java обробляє дженерики. = (

Редагувати : 1) Я зіткнувся з проблемою, де потоки додавали / видаляли слухачів під час події. Під Listчас використання його неможливо змінити, тому я додав synchronizedблоки, де доступ до списку слухачів використовується або використовується, блокуючись у самому списку.


Надсилання подій під час перебування в блокуванні (синхронізованому чи іншим способом) - це тупик, який чекає. У цьому випадку було б краще скопіювати слухачів, перебуваючи в синхронізованому блоці, і повторити новий список.
— ssindelar

Використовуйте ConcurrentLinkedQueue . Він не потребує блокування, тому що має слабко послідовний ітератор, який ніколи не кидає ConcurrentModificationException.
— Стефан Доллаз

8

Вставити методи тестування слід, коли-коли

Нещодавно я побачив подібну версію до цієї, коли програмував пару з дуже хорошим розробником та другом, і, думаю, це може бути приємним доповненням до цього списку.

Цей шаблон створить новий метод тестування для класу, дотримуючись параметр « Подано - Коли - Тоді» з парадигми, розробленої поведінкою (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)}

Мені подобається той шаблон. Я додав "Виняток викидів", щоб ще більше полегшити тестовий комфорт.
— Торстен

Мені подобається парадигма BDD. Дуже приємний шаблон для цього. І лише зауваження: вашого дуже-хорошого розробника-і-друга вже немає!
— боббел

7

Весняні ін'єкції

Я знаю, що це щось із запізненням до гри, але ось я використовую для 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

Ось конструктор для неіснуючих класів:

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

5

Мені подобається генерований коментар до класу, як це:

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

"Я ..." негайно спонукає розробника описати, що робить клас. Я, здається, вдосконалює проблему незадокументованих занять.

І звичайно, $ Id $ - корисне ключове слово CVS.


5

Я багато використовував ці фрагменти, шукав 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}");
}

Ви також можете повторно використовувати шаблон перевірки нуля зверху та застосувати цей фрагмент, щоб перевірити лише чи порожні рядки. Потім ви використовуєте ці два шаблони для створення вищевказаного коду.

У наведеному вище шаблоні є проблема, що якщо аргумент остаточний, вам доведеться деякі змінити створений код ( ${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}");
}

аргумент тесту

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

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

Ви вводите ім'я змінної або умову, яка повертає значення, після чого операнд ("==", "<", ">" тощо) та інше значення або змінну, і якщо тест не вдасться, результат отриманий код кине IllegalArgumentException.

Причиною дещо складного, якщо пункт із усім виразом, загорнутим у "! ()", - це зробити можливим повторне використання тестової умови у повідомленні про виключення.

Можливо, це збентежить колегу, але лише в тому випадку, якщо їм доведеться подивитися на код, який, можливо, не доведеться, якщо ви кинете такі винятки ...

Ось приклад з масивами:

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

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


4

Я використовую це для 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

Мої улюблені кілька ...

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

java.io.FileOutputStream fos = new java.io.FileOutputStream( new java.io.File("c:\\x.x"));
fos.write(buffer.toString().getBytes());
fos.flush();
fos.close();
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.