Шукаю корисні шаблони коду 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.