EclipseでさまざまなJavaコードテンプレートを作成することができます。
ウィンドウ>設定> Java>エディタ>テンプレート
例えば.
sysout
は次のように展開されます。
System.out.println(${Word_selection}${});${cursor}
sysout
に続けてCTRL+SPACE
とタイプすることでこれを有効にすることができます。
現在どのような便利なJavaコードテンプレートを使用していますか?それの名前と説明、そしてなぜそれが素晴らしいのかを含めてください。
私は組み込みの既存の機能ではなく、テンプレートの独創的/新規な使用法を探しています。
次のコードテンプレートは、必要に応じてロガーを作成し、適切なインポートを作成します。
SLF4J
${:import(org.slf4j.Logger,org.slf4j.LoggerFactory)}
private static final Logger LOG = LoggerFactory.getLogger(${enclosing_type}.class);
Log4J 2
${:import(org.Apache.logging.log4j.LogManager,org.Apache.logging.log4j.Logger)}
private static final Logger LOG = LogManager.getLogger(${enclosing_type}.class);
Log4J
${:import(org.Apache.log4j.Logger)}
private static final Logger LOG = Logger.getLogger(${enclosing_type}.class);
出典 。
JUL
${:import(Java.util.logging.Logger)}
private static final Logger LOG = Logger.getLogger(${enclosing_type}.class.getName());
いくつかの追加のテンプレートがここにあります: リンクI - リンクII
私はこれが好きです:
readfile
${:import(Java.io.BufferedReader,
Java.io.FileNotFoundException,
Java.io.FileReader,
Java.io.IOException)}
BufferedReader in = null;
try {
in = new BufferedReader(new FileReader(${fileName}));
String line;
while ((line = in.readLine()) != null) {
${process}
}
}
catch (FileNotFoundException e) {
logger.error(e) ;
}
catch (IOException e) {
logger.error(e) ;
} finally {
if(in != null) in.close();
}
${cursor}
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
}
MessageFormat - 選択範囲をMessageFormatで囲みます。
${:import(Java.text.MessageFormat)}
MessageFormat.format(${Word_selection}, ${cursor})
これにより、カーソルを文字列に移動し、選択範囲を文字列全体に拡大して(Shift-Alt-Up)、Ctrl-Spaceを2回押すことができます。
lock - 選択した行をtry finallyロックで囲みます。ロック変数が存在すると仮定します。
${lock}.acquire();
try {
${line_selection}
${cursor}
} finally {
${lock}.release();
}
NB ${line_selection}
テンプレートはサラウンドメニュー(Alt-Shift-Z)に表示されます。
私は死んだポストを蹴っていることを知っていますが、完成のためにこれを共有したいと思いました:
シングルトン生成テンプレートの正しいバージョン。欠陥のあるダブルチェックロッキング設計を克服します(上記で説明し、他の箇所で説明しています)。
シングルトン作成テンプレート:これにcreatesingleton
という名前を付けます。
static enum Singleton {
INSTANCE;
private static final ${enclosing_type} singleton = new ${enclosing_type}();
public ${enclosing_type} getSingleton() {
return singleton;
}
}
${cursor}
上記の方法で生成されたシングルトンにアクセスするには:
シングルトンリファレンステンプレート:これにgetsingleton
という名前を付けます。
${type} ${newName} = ${type}.Singleton.INSTANCE.getSingleton();
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();
|
}
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};
Voidを宣言して例外をスローします。
${:import(org.mockito.invocation.InvocationOnMock,org.mockito.stubbing.Answer)}
doThrow(${RuntimeException}.class).when(${mock:localVar}).${mockedMethod}(${args});
何かをするためにvoidメソッドを偽造します:
${: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});
モックされたメソッドが1回だけ呼び出されたことを確認します。
${: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();
また、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}
}
私の最愛の人の1人はforeachです。
for (${iterable_type} ${iterable_element} : ${iterable}) {
${cursor}
}
そして、traceoutです。追跡に使用しているからです。
System.out.println("${enclosing_type}.${enclosing_method}()");
私はちょうど別のものについて考えて、そしていつかインターネット上でそれを見つけました、const:
private static final ${type} ${name} = new ${type} ${cursor};
Sysoutについてのちょっとしたコツ - 名前を "sop"に変更したい。 Javaのライブラリには、 "sop"で始まるものは何もないので、すぐに "sop"と入力してブームすることができます。
現在のスコープ内の変数で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
*
*/
次に、[タスク]ビューに、会議中に表示したいすべてのコードレビューコメントを表示します。
ここでさらにいくつかのテンプレート。
含まれています:
${imp:import(org.slf4j.Logger,org.slf4j.LoggerFactory)}
private static final Logger LOGGER = LoggerFactory
.getLogger(${enclosing_type}.class);
Java 7以降では、包含クラスへの静的参照を必要とする(または好む)ロガーを設定するための優れた方法は、新しく導入されたMethodHandles APIを使用して静的コンテキストでランタイムクラスを取得することです。
SLF4Jのスニペットの例は次のとおりです。
private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
どのIDEでも単純なスニペットであることは別として、特定の機能を別のクラスにリファクタリングしても、誤ってクラス名を付けてしまうことはないので、それほど脆弱ではありません。
Beanプロパティ
private ${Type} ${property};
public ${Type} get${Property}() {
return ${property};
}
public void set${Property}(${Type} ${property}) {
${propertyChangeSupport}.firePropertyChange("${property}", this.${property}, this.${property} = ${property});
}
PropertyChangeSupport
private PropertyChangeSupport ${propertyChangeSupport} = new PropertyChangeSupport(this);${:import(Java.beans.PropertyChangeSupport,Java.beans.PropertyChangeListener)}
public void addPropertyChangeListener(PropertyChangeListener listener) {
${propertyChangeSupport}.addPropertyChangeListener(listener);
}
public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) {
${propertyChangeSupport}.addPropertyChangeListener(propertyName, listener);
}
public void removePropertyChangeListener(PropertyChangeListener listener) {
${propertyChangeSupport}.removePropertyChangeListener(listener);
}
public void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) {
${propertyChangeSupport}.removePropertyChangeListener(propertyName, listener);
}
strf -> String.format("msg", args)
は非常に単純ですが、入力の手間が省けます。
String.format("${cursor}",)
コードを使ってテストするとき、私はいくつかのsysoを削除するのを見逃していました。そこで私は自分自身でsytというテンプレートを作りました。
System.out.println(${Word_selection}${});//${todo}:remove${cursor}
私がコンパイルする前に、私はいつも私のTODOをチェックし、System.outをもう一度削除することを決して忘れないでしょう。
GUIスレッドでコードを呼び出します
次のテンプレートをショートカットslater
にバインドして、GUIスレッドにコードをすばやくディスパッチします。
${:import(javax.swing.SwingUtilities)}
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
${cursor}
}
});
ロガー宣言のテンプレートは素晴らしいです。
私は私がより頻繁に使用するログレベルのlinfo、debug、warn、errorも作成します。
エラー:
logger.error(${Word_selection}${});${cursor}
現在のディスプレイからSWTカラーを取得します。
Display.getCurrent().getSystemColor(SWT.COLOR_${cursor})
Syncexecによるサラウンド
PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable(){
public void run(){
${line_selection}${cursor}
}
});
シングルトンデザインパターンを使用します。
/**
* The shared instance.
*/
private static ${enclosing_type} instance = new ${enclosing_type}();
/**
* Private constructor.
*/
private ${enclosing_type}() {
super();
}
/**
* Returns this shared instance.
*
* @returns The shared instance
*/
public static ${enclosing_type} getInstance() {
return instance;
}
私は最近非常に良い開発者と友人とのペアプログラミング中にこれと似たバージョンを見ました、そして私はそれがこのリストへの素晴らしい追加になるかもしれないと思う。
このテンプレートは、 ビヘイビアドリブン開発 (BDD)パラダイムから 与えられた方法 に従って、クラスに新しいテストメソッドを作成します。コードを構造化するためのガイドとして、コメントについて。メソッド名は "should"で始まり、残りのダミーのメソッド名 "CheckThisAndThat"をテストメソッドの責任を説明するための最良の説明に置き換えることができます。名前を入力すると、TABキーを押すと直接// Given section
に移動します。そのため、前提条件を入力し始めることができます。
私はそれを3つの文字 "tst"にマッピングし、 "テストメソッドはいつ与えられるべきか"という説明を付けました。
私がそれを見たときに私が行ったようにあなたがそれが有用であると思うことを願っています:
@Test
public void should${CheckThisAndThat}() {
Assert.fail("Not yet implemented");
// Given
${cursor}
// When
// Then
}${:import(org.junit.Test, org.junit.Assert)}
そしてequalsbuilder、hashcodebuilderの適応:
${:import(org.Apache.commons.lang.builder.EqualsBuilder,org.Apache.commons.lang.builder.HashCodeBuilder)}
@Override
public boolean equals(Object obj) {
return EqualsBuilder.reflectionEquals(this, obj);
}
@Override
public int hashCode() {
return HashCodeBuilder.reflectionHashCode(this);
}
イベントはJavaで作成するのはちょっと面倒です - それらすべてのインターフェース、メソッド、そして1つのイベントだけのために書くもの - 私は1つのイベントに必要なものすべてを作成する簡単なテンプレートを作りました。
${:import(Java.util.List, Java.util.LinkedList, Java.util.EventListener, Java.util.EventObject)}
private final List<${eventname}Listener> ${eventname}Listeners = new LinkedList<${eventname}Listener>();
public final void add${eventname}Listener(${eventname}Listener listener)
{
synchronized(${eventname}Listeners) {
${eventname}Listeners.add(listener);
}
}
public final void remove${eventname}Listener(${eventname}Listener listener)
{
synchronized(${eventname}Listeners) {
${eventname}Listeners.remove(listener);
}
}
private void raise${eventname}Event(${eventname}Args args)
{
synchronized(${eventname}Listeners) {
for(${eventname}Listener listener : ${eventname}Listeners)
listener.on${eventname}(args);
}
}
public interface ${eventname}Listener extends EventListener
{
public void on${eventname}(${eventname}Args args);
}
public class ${eventname}Args extends EventObject
{
public ${eventname}Args(Object source${cursor})
{
super(source);
}
}
単一のEventObject
を共有するイベントがある場合は、テンプレートによって挿入されたカスタマイズされたものを削除し、raise___()
とon____()
の適切な部分を変更するだけです。
汎用インターフェースと汎用クラスを使用して、素晴らしく、小さく、洗練されたイベントメカニズムを作成しましたが、Javaが総称を処理する方法が原因で機能しません。 =(
編集:1)イベントが発生している間にスレッドがリスナーを追加/削除していた問題に遭遇しました。 List
は使用中に変更できないので、リスナのリストがアクセスまたは使用されている場所にsynchronized
ブロックを追加し、リスト自体をロックします。
スプリングインジェクション
私はこれがゲームには遅いようなものであることを知っています、しかしここに私がクラスの中で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
の値と空の文字列を探して、これらの断片を多用してきました。
受け取った引数をチェックするために、私は自分のメソッドの最初のコードとして "argument test"テンプレートを使います。
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}");
}
上記のnullチェックテンプレートを再利用して、空の文字列のみをチェックするようにこのスニペットを実装することもできます。その後、これら2つのテンプレートを使用して上記のコードを作成します。
しかし、上記のテンプレートには、in引数がfinalの場合、生成されたコードを修正する必要があるという問題があります(${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$
*/
"I ..."はすぐに開発者にクラスの動作を説明するように促します。私は文書化されていないクラスの問題を改善するようです。
そしてもちろん、$ Id $は便利なCVSキーワードです。
私の好きな少数は….
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();
リフレクションではなく明示的なテストを使用すると、セキュリティマネージャでは遅くなり、失敗する可能性があります( EqualsBuilder javadoc )。
テンプレートには20のメンバーが含まれています。 TABを使って移動することができます。終了したら、apppend()
への残りの呼び出しは削除されなければなりません。
${:import(org.Apache.commons.lang.builder.HashCodeBuilder, org.Apache.commons.lang.builder.EqualsBuilder)}
@Override
public int hashCode() {
return new HashCodeBuilder()
.append(${field1:field})
.append(${field2:field})
.append(${field3:field})
.append(${field4:field})
.append(${field5:field})
.append(${field6:field})
.append(${field7:field})
.append(${field8:field})
.append(${field9:field})
.append(${field10:field})
.append(${field11:field})
.append(${field12:field})
.append(${field13:field})
.append(${field14:field})
.append(${field15:field})
.append(${field16:field})
.append(${field17:field})
.append(${field18:field})
.append(${field19:field})
.append(${field20:field})
.toHashCode();
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (obj == this) {
return true;
}
if (obj.getClass() != getClass()) {
return false;
}
${enclosing_type} rhs = (${enclosing_type}) obj;
return new EqualsBuilder()
.append(${field1}, rhs.${field1})
.append(${field2}, rhs.${field2})
.append(${field3}, rhs.${field3})
.append(${field4}, rhs.${field4})
.append(${field5}, rhs.${field5})
.append(${field6}, rhs.${field6})
.append(${field7}, rhs.${field7})
.append(${field8}, rhs.${field8})
.append(${field9}, rhs.${field9})
.append(${field10}, rhs.${field10})
.append(${field11}, rhs.${field11})
.append(${field12}, rhs.${field12})
.append(${field13}, rhs.${field13})
.append(${field14}, rhs.${field14})
.append(${field15}, rhs.${field15})
.append(${field16}, rhs.${field16})
.append(${field17}, rhs.${field17})
.append(${field18}, rhs.${field18})
.append(${field19}, rhs.${field19})
.append(${field20}, rhs.${field20})${cursor}
.isEquals();
}
私はこれをMessageFormatに使っています(Java 1.4を使って)。そのようにして私は国際化をするときに抽出するのが難しい連結がないことを確信しています
国際化
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));
}
JUnit 4.8.2の新しい機能(assertThat、is、hasItemsなど)を使用したい場合は、必要最低限のインポートで@Testメソッドを生成するためのテンプレートがあります。
@${testType:newType(org.junit.Test)}
public void ${testName}() throws Exception {
// Arrange
${staticImport:importStatic('org.hamcrest.MatcherAssert.*','org.hamcrest.Matchers.*')}${cursor}
// Act
// Assert
}
テストを書くとき、私はすでにそれを何度も使った。
プラグインの助けを借りて: http://code.google.com/p/Eclipse-log-param/
以下のテンプレートを追加することが可能です。
logger.trace("${enclosing_method}. ${formatted_method_parameters});
そして結果を得る:
public static void saveUserPreferences(String userName, String[] preferences) {
logger.trace("saveUserPreferences. userName: " + userName + " preferences: " + preferences);
}
私はAndroid開発に以下のテンプレートを使用します。
詳細(対数)
Log.v(TAG, ${Word_selection}${});${cursor}
デバッグ(ログ)
Log.d(TAG, ${Word_selection}${});${cursor}
情報(ロジ)
Log.i(TAG, ${Word_selection}${});${cursor}
警告(Logw)
Log.w(TAG, ${Word_selection}${});${cursor}
エラー(Loge)
Log.e(TAG, ${Word_selection}${});${cursor}
アサート(Loga)
Log.a(TAG, ${Word_selection}${});${cursor}
TAGは私があらゆる活動で定義する定数です。
これは、ローカルな値を印刷/ログ記録するという面倒な作業の多くを省きます。 String内の変数名を自動的に取得します。これにより、入力やタイプミスを大幅に軽減できます。
テンプレート:
+ ", ${1:var}: " + ${1:var}
これには2つの落とし穴があります。
ローカル/パラメータ/フィールドを選択するように求められますが、これにはプリミティブ:(は含まれません
コードがエラーなしでコンパイルされるときはいつでも、プロンプトが最も頻繁に発生します。このマクロを使用すると一時的に壊れた構文が生成されることが多いので、複数の変数を挿入するにはある程度の調整が必要です。変数名にタイプミスがないという便利さに近いものは何もありません。
@Duncan Jonesにはすでにこのテンプレートがありますが、${line_selection}
を追加して Shift + Alt + Z 便利な戦術です。
これは私が取り組んでいるプロジェクトの悪いデザインに対するちょっとしたハックな修正としてほんの少し役に立つだけかもしれませんが、私はレガシーコードがAWTスレッドからSwingコンポーネントを変更して断続的なバグを引き起こしている多くの状況を持っています。これらを素早く修正するために、私は使っています:
${:import(javax.swing.SwingUtilities)}
// Ensure that any Swing components will be invoked only from the AWT thread
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
${line_selection}${cursor}
}
});
だから私は問題のある文を強調して使用することができます Shift + Alt + Z で囲む。このテンプレートをswinvoke
と呼びます。
これがList<Stuff>
を反復処理するのに役立つforeach
です。ループ内のオプションのコンテンツは、リストから要素を見つけてそれを返すためのものです。
for (${t:elemType(w)} elem: ${w:collection}) {
if (elem.get.equals(${localVar})){
return elem;
}
}
return null;
EasyMockテンプレート
モックを作成
${:importStatic(org.easymock.EasyMock.createMock)}
${type} ${name} = createMock(${type}.class);
モックをリセット
${:importStatic(org.easymock.EasyMock.reset)}
reset(${var});
リプレイモック
${:importStatic(org.easymock.EasyMock.replay)}
replay(${var});
モックを確認
${:importStatic(org.easymock.EasyMock.verify)}
verify(${var});
選択したWordから新しい JUnit テストケースを作成します。
これにはロガーが必要です(_loggerと呼ばれます:このスレッドにも非常に素晴らしいテンプレートがあります)。
私はこのテンプレートが大好きです。なぜなら、私が考える前に、実装されていないテストケースを素早く作成するのがとても簡単だからです。私がテストする必要があるケースを思い出させるものとして、彼らは私に失敗してそこに座るでしょう。
${:import(org.junit.Test, org.junit.Assert)}
@Test
public void fooTest() throws Throwable {
try {
${cursor}
Assert.fail("Not Implemented");
} catch (Throwable e) {
_logger.error("Failed test", e);
throw e;
}
}
それを使用するには、テストケースの名前(たとえばtestSerializeObject)を入力し、Wordをハイライトしてヒットします。 Ctrl + Space (またはコードアシスト用に設定したものは何でも)。
JUnitの例外ビューアではなくコンソールで例外を確認するのが好きなので、テストケース用の私のお気に入りのテンプレートは例外を記録してからそれらを再スローするものです。
テストでログファイルよりもSystem.outを好む場合は、常に次のようなものを使用できます。
${:import(org.junit.Test, org.junit.Assert)}
@Test
public void ${Word_selection}() throws Exception {
try {
${cursor}
Assert.fail("Not Implemented");
} catch (Exception e) {
System.out.println("Failed test");
e.printStackTrace();
throw e;
}
}
コードセクション
//--------------------------------------------------------------
// ${title}
//--------------------------------------------------------------
${cursor}
このテンプレートを使用して、コードのセクションへのコメント付けを簡単にします。それほど複雑ではありませんが、多くの時間を節約できました:)
SWTとプラグイン開発のための内部リスナークラス
${imports:import(org.Eclipse.swt.widgets.Listener)}
private class ${className} implements Listener{
@Override
public void handleEvent(Event e) {
final Widget w = e.widget;
}
}
list_methods - リストの追加、削除、カウント、包含のためのメソッドを生成します
public void add${listname}(${listtype} toAdd){
get${listname}s().add(toAdd);
}
public void remove${listname}(${listtype} toRemove){
get${listname}s().remove(toRemove);
}
public ${listtype} get${listname}(int index){
return get${listname}s().get(index);
}
public int get${listname}Count(){
return get${listname}s().size();
}
public boolean contains${listname}(${listtype} toFind){
return get${listname}s().contains(toFind);
}
${cursor}
id - 簡単なJPAのためのアノテーション、インポート、フィールド、そしてゲッターを挿入します。
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
public Long getId(){
return id;
}
${cursor}
${:import (javax.persistence.GenerationType,javax.persistence.GeneratedValue,javax.persistence.Id)}
基本的なテストクラスを作成するテンプレートの答えを見ました。代わりにこの方法を好む場合は、次のような個々の呼び出しがあります。
@BeforeインポートでsetUpメソッドを作成する
${:import(org.junit.Before)}
@Before
public final void setUp() {
${cursor}
}
@Test importで新しいテストメソッドを作成します
${:import(org.junit.Test)}
@Test
public final void test${newName} () {
${cursor}
}
型と DTO の間のJAXB変換を支援するために、以下を使用します。
既存の変数を戻り値の型に変換するためのテンプレート(パラメータと連動)
${return_type} ${name} = null;
if (${var} != null) {
${name} = new ${return_type}();
${cursor}
}
return ${name};
${array_type}[] ${v:var(Vector)}Array = new ${array_type}[${v}.size()];
${v}.copyInto(${v}Array);
新しいJUnitテスト方法
@${testType:newType(org.junit.Test)}
public void ${testname}() throws Exception {
${staticImport:importStatic('org.junit.Assert.*')}${cursor}
String expected = "" ;
String actual = "" ;
Assert.assertEquals(expected, actual);
}
これはオブジェクト全体を表示します(log4j LOGGERオブジェクトを既に起動していると仮定します)。
${:import(org.codehaus.jackson.map.ObjectMapper)}
// If check to avoid argument evaluation costs
if (LOGGER.isDebugEnabled()) {
try {
LOGGER.debug("Object ${Object}: " + "\n"
+ new ObjectMapper().writeValueAsString(${Object}));
} catch (JsonGenerationException e) {
LOGGER.info(e.toString());
} catch (JsonMappingException e) {
LOGGER.info(e.toString());
} catch (IOException e) {
LOGGER.info(e.toString());
}
}