Полезные шаблоны кода 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
- Проследить
- Формат Строка
- Код комментария
- Формат строки
- Попробуй наконец заблокировать
- Формат сообщения i18n и лог
- Equalsbuilder
- Hashcodebuilder
- Инжекция пружинных объектов
- Создать файл OutputStream
46 ответов
Следующие шаблоны кода создадут регистратор и, при необходимости, создадут правильный импорт.
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());
Некоторые дополнительные шаблоны здесь: Ссылка I - Ссылка II
Мне нравится этот:
Re adFile
${: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-Space.
Блокировка выбора
заблокировать - окружить выделенные строки попыткой заблокировать наконец. Предположим наличие переменной блокировки.
${lock}.acquire();
try {
${line_selection}
${cursor}
} finally {
${lock}.release();
}
NB ${line_selection}
шаблоны отображаются в меню Surround With (Alt-Shift-Z).
Добавить фрагмент кода для итерации 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();
|
}
Я знаю, что я бью мертвый пост, но хотел поделиться этим для завершения:
Правильная версия шаблона генерации синглтона, которая преодолевает ошибочную конструкцию двойной проверки блокировки (обсуждалась выше и упоминалась где-то еще)
Шаблон создания синглтона: назовите это 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);
Создайте макет с помощью 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 (и аналогичный для 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
Нулевые Проверки!
if( ${word_selection} != null ){
${cursor}
}
if( ${word_selection} == null ){
${cursor}
}
Один из моих любимых - foreach:
for (${iterable_type} ${iterable_element} : ${iterable}) {
${cursor}
}
И отслеживание, так как я часто использую его для отслеживания:
System.out.println("${enclosing_type}.${enclosing_method}()");
Я просто подумал о другом и однажды нашел его в Интернете, const:
private static final ${type} ${name} = new ${type} ${cursor};
Небольшой совет по sysout - мне нравится переименовывать его в "sop". Ничто другое в java-библиотеках не начинается с "sop", так что вы можете быстро ввести "sop" и boom, он вставит.
Создайте исключение IllegalArgumentException с переменной в текущей области (illarg):
throw new IllegalArgumentException(${var});
Лучше
throw new IllegalArgumentException("Invalid ${var} " + ${var});
Ничего особенного для производства кода - но весьма полезно для обзоров кода
У меня есть мой шаблон coderev low/med/high, сделайте следующее
/**
* Code Review: Low Importance
*
*
* TODO: Insert problem with code here
*
*/
А затем в представлении "Задачи" - отобразятся все комментарии к обзору кода, которые я хочу поднять во время собрания.
Еще несколько шаблонов здесь.
Включает в себя:
- Создать объект даты с определенной даты
- Создать новый универсальный ArrayList
- Настройка логгера
- Вход с указанным уровнем
- Создать новый универсальный HashMap
- Итерация по карте, печать ключей и значений
- Разобрать время с помощью SimpleDateFormat
- Читать файл построчно
- Войти и отбросить пойманную исключение
- Время печати блока кода
- Создать периодический таймер
- Записать строку в файл
slf4j Logging
${imp:import(org.slf4j.Logger,org.slf4j.LoggerFactory)}
private static final Logger LOGGER = LoggerFactory
.getLogger(${enclosing_type}.class);
Bean Property
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);
}
После Java 7 отличный способ настроить средства ведения журнала, которым требуются (или предпочитать) статические ссылки на включающий класс, - это использовать недавно представленный API-интерфейс MethodHandles, чтобы получить класс времени выполнения в статическом контексте.
Пример фрагмента для SLF4J:
private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
Помимо того, что он является простым фрагментом в любой среде IDE, он также менее хрупок, если вы реорганизуете определенную функциональность в другой класс, потому что вы не будете случайно носить имя класса с ним.
При тестировании кода я иногда пропускал удаление некоторых syso. Поэтому я сделал себе шаблон под названием syt.
System.out.println(${word_selection}${});//${todo}:remove${cursor}
Перед компиляцией я всегда проверяю свои TODO и никогда не забуду снова удалить System.out.
strf -> String.format("msg", args)
довольно просто, но экономит немного печатать.
String.format("${cursor}",)
Вызвать код в потоке GUI
Я привязываю следующий шаблон к ярлыку slater
для быстрой отправки кода в потоке GUI.
${:import(javax.swing.SwingUtilities)}
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
${cursor}
}
});
Создать все для события
Поскольку создавать события в Java довольно сложно - все эти интерфейсы, методы и все, что нужно написать только для одного события, - я создал простой шаблон для создания всего необходимого для одного события.
${: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
блокирует доступ или использование списка слушателей, блокируя сам список.
Получить цвет SWT из текущего дисплея:
Display.getCurrent().getSystemColor(SWT.COLOR_${cursor})
Suround с syncexec
PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable(){
public void run(){
${line_selection}${cursor}
}
});
Используйте шаблон проектирования Singleton:
/**
* The shared instance.
*/
private static ${enclosing_type} instance = new ${enclosing_type}();
/**
* Private constructor.
*/
private ${enclosing_type}() {
super();
}
/**
* Returns this shared instance.
*
* @returns The shared instance
*/
public static ${enclosing_type} getInstance() {
return instance;
}
Вставьте методы испытаний, которые должны быть даны, когда
Недавно я видел аналогичную версию этой версии во время парного программирования с очень хорошим разработчиком и другом, и я думаю, что это может быть хорошим дополнением к этому списку.
Этот шаблон создаст новый метод тестирования в классе, следуя подходу " Дано - Когда - Тогда" из парадигмы поведенческой разработки (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)}
И Equals Builder, адаптация 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}
Весенний впрыск
Я знаю, что это немного поздно для игры, но вот один, который я использую для 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};
}
Вот конструктор для неинстанцируемых классов:
// 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);
}
}
Я много использовал эти фрагменты, искал 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}");
}
Вы также можете повторно использовать шаблон проверки нуля сверху и реализовать этот фрагмент, чтобы проверять только пустые строки. Затем вы будете использовать эти два шаблона для создания кода выше.
Приведенный выше шаблон, однако, имеет проблему, заключающуюся в том, что если аргумент 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.length" [TAB] "== to.length".
В результате получается намного смешнее, чем ArrayIndexOutOfBoundsException или подобное, и может фактически дать вашим пользователям шанс выяснить проблему.
Наслаждайтесь!
Мне нравится сгенерированный комментарий класса:
/**
* I...
*
* $Id$
*/
"Я..." немедленно побуждает разработчика описать, что делает класс. Я, кажется, улучшить проблему недокументированных классов.
И, конечно же, $Id$ - это полезное ключевое слово CVS.
Я использую это для 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));
}
Мои любимые несколько...
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();