有用なEclipse Javaコードテンプレートを探す[終了]


517

EclipseでさまざまなJavaコードテンプレートを作成できます。

ウィンドウ>設定> Java>エディター>テンプレート

例えば

sysout 次のように展開されます:

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

あなたは次のように入力して、これをアクティブにすることができますsysoutが続きますCTRL+SPACE

現在、どのような有用なJavaコードテンプレートを使用していますか?それの名前と説明、そしてそれが素晴らしい理由を含めてください。

組み込みの既存の機能ではなく、テンプレートのオリジナル/新規の使用を探しています。

  • Log4Jロガーを作成する
  • ディスプレイからSWTカラーを取得
  • Syncexec-Eclipseフレームワーク
  • シングルトンパターン/列挙型シングルトン生成
  • Readfile
  • 定数
  • 描きます
  • フォーマット文字列
  • コメントコードレビュー
  • 文字列フォーマット
  • 最後にロックを試す
  • メッセージ形式i18nおよびログ
  • Equalsbuilder
  • ハッシュコードビルダー
  • スプリングオブジェクトインジェクション
  • FileOutputStreamを作成する

5
可能なすべてのケースでEnumからswitchステートメントを生成するものはありますか?CTRL + 1でこれを実行できることはわかっていますが、代わりにcmd補完を使用します。
GreenKiwi

4
どういうSystem.out.println(${word_selection}${});${cursor}意味ですか?単語を選択して、それをsysout通話内に自動的に入れる方法があるようですが、そうですか?どうやって?
CodyBugstein 2013年

3
sysout呼び出しで囲んだ単語を強調表示し、Ctrl-スペースキーを押します(強調表示対応のテンプレートがたくさんある場合は、テンプレートの名前を入力します)
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);

ソース

7月

${:import(java.util.logging.Logger)}
private static final Logger LOG = Logger.getLogger(${enclosing_type}.class.getName());

31
涼しい。$ {:import ...}については知りませんでした。
JesperE 2009年

3
$ {:import ...}はEclipseの新しいバージョンでのみ機能すると思います。3.2で止まってしまい、動作しません。
アダムクルーム

私のバージョン(3.5)にもありません。それが導入されたバージョンを誰かが知っていますか?
finnw

5
大好きです!しかし、ロガー宣言の下に$ {import ...}を配置して、新しい行を追加しないようにします。
Dario Seidl 14

1
@TMS-追加、ありがとう!
Robert Munteanu 2016年

49

ここではいくつかの追加のテンプレート:リンク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} 

更新:このテンプレートの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 '06 / 07/13

3
エラーあなたはポイントを逃したと思います...私はあなたのポイントが何であるかを実際には知らないと言っています...それはモジュール化ではなくコード生成についてです...
Jon

20
重要なのは、テンプレートにこれだけ多くのコードを追加することは、非常に一般的な状況では、カットアンドペーストのプログラミングであるということです。
スコットマッキンタイア2011年

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を2回押します。

選択をロック

lock-選択した行をtry finally lockで囲みます。ロック変数が存在すると想定します。

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

NB ${line_selection}テンプレートは、Surround Withメニュー(Alt-Shift-Z)に表示されます。


私はこれをログステートメントと組み合わせて使用​​します:logger.info(MessageFormat.format($ {word_selection}、$ {cursor});
Pierre Henry

ロックを取得および解放するためのメソッドはおよびと呼ばlockunlockます。acquireそして、releaseセマフォのために使用されているとのtry-finallyブロック内での使用はそれほど強くロックのように推奨されません
Marco Lackovic 2014年

Ctrl + Spaceを2回押すと機能しなくなり、SWTテンプレートが表示されます。代替品はありますか?
Noumenon

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
死んでいるのではなく、コミュニティのwikiなので、テンプレートを見つけたらそれにテンプレートを追加するのは理にかなっています。これらの包括的なセットは他にはありません...
Jon

ジョン、以前の投稿と私の投稿の時間差は8か月近くだったので、そう言わざるを得ませんでした。私はあなたのコメントよりもうまく表現することができませんでした:)
questzen

これをクラス(クラス内のネストされた列挙型)の一部として作成すると、クラスの名前が ${enclosing_type}意図したとおりになりますか?
Mr_and_Mrs_D

1
@Mr_and_Mrs_D、それがポイントだと思います。このテンプレートを配置したクラスのシングルトンインスタンスを取得します。これで、必要なのは、囲んでいる型コンストラクタをプライベートにして、かなり安全なシングルトンジェネレータを用意することだけです。
Mike Adler

あなたが列挙型の使用作成するには、このを使用する場合${primary_type_name}の例を:public enum ${primary_type_name} { INSTANCE; private ${return_type} ${name} = new ${return_type}(); public ${return_type} ${getName}(${}) { return ${name}; } ${cursor} }
ロバート・スミット

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 2018

25

の場合log、メンバー変数に追加するのに役立つ小さな役目を果たします。

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

ログファイルに手動で書き込む場合:$ {:import(java.io.PrintWriter、java.io.BufferedWriter、java.io.FileWriter)} try {PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter($ {logFile: var(String)}、true))); out.println($ {logLine:var(String)} $ {cursor}); out.close(); } catch(IOException e){/ * TODO:例外処理* / e.printStackTrace(); }
Jack Miller、

24

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

1
私は好奇心旺盛です:なぜあなたはロガーをあざける必要があるのですか?
ウラジミールシジコフ

6
例外がキャッチされた場合に失敗したロガーが呼び出されたことを確認できます(失敗シナリオ)。これは、再スローするつもりはないが、黙って無視されないことを主張したい場合に特に便利です。
マントリド

23

ヌルチェック!

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

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

PreConditions.checkNotNull(...)グアバの方法は、非常に読みやすい選択肢です(特に静的インポートの場合)
–ThorbjørnRavn Andersen 2013

nullではないことを確認する前に、null(== null)を確認することをお勧めします。
KrishPrabakar 2014

21

私の最愛の人はforeachです:

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

そしてtraceout、私はそれを追跡のためにたくさん使っているので:

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

私は別のものについて考えただけで、インターネット上でそれをいつか見つけました、const

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

11
foreachはEclipseの標準コードアシストとして利用できますが、テンプレートが標準バージョンに追加の機能を備えているとは思いません
リッチセラー

4
そう、sysoutは非常に革新的なテンプレートです。問題は、私たちが使用している便利なテンプレートに関するものでした。
Artem Barger

4
あなたtraceoutはすでにEclipseとして利用可能ですsystrace
dogbane 2011

7
いいですね、この質問のためにEclipseに表示されると思います。
Artem Barger、2011

constはstatic_finalとして標準のコードアシストとして使用できます(いつ追加されたのかは不明です)
Armand

20

sysoutに関するちょっとしたヒント-私はそれを "sop"に改名したい。「sop」で始まるjava libsの他のものは何もないので、「sop」とすばやく入力してブームを挿入できます。


11
デフォルトでは、sysoと入力するだけでsysoutと同じように動作します。
MasterScrat 2011

9
でも、sopで25%勝ってください;)
Scott Stanchfield

2
Eclipse Mars なので、ショートカット"syso" + Ctrl + Spaceの後ろに悪いステップがあります。名前にs、y、s、oの文字が含まれるクラスがいくつかリストされます(新しいCamelCaseの検出により)。したがって、ここでリストからさらにsysoutを選択してReturn キーを押す必要があります。
bobbel 2015

17

現在のスコープ(illarg)に変数を持つIllegalArgumentExceptionをスローします。

throw new IllegalArgumentException(${var});

より良い

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

14

コード生成には特別なことはありませんが、コードレビューには非常に役立ちます。

テンプレートcoderevを低/中/高にして、次のようにします

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

次に、[タスク]ビューで、会議中に持ち出したいすべてのコードレビューコメントを表示します。


14

ここにいくつかのテンプレートがあります

含まれるもの:

  • 特定の日付から日付オブジェクトを作成する
  • 新しいジェネリックArrayListを作成する
  • ロガーのセットアップ
  • 指定したレベルのログ
  • 新しい汎用HashMapを作成する
  • マップを反復処理し、キーと値を出力します
  • SimpleDateFormatを使用して時間を解析する
  • 1行ずつファイルを読み取る
  • キャッチした例外をログに記録して再スローする
  • コードブロックの実行時間を出力する
  • 定期的なタイマーを作成する
  • 文字列をファイルに書き込む

ウェイバックマシンリンクを追加
berezovskyi 2016

12

slf4jロギング

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

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

10

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

10

ポストJava 7は、包含クラスへの静的参照を必要とする(または好む)ロガーを設定する優れた方法として、新しく導入されたMethodHandles APIを使用して、静的コンテキストでランタイムクラスを取得します。

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を削除できなかったことがあります。そこで私は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 を使用すると、文字列とオブジェクトのリストをタブで移動できるからです。
Duncan Jones

私はこのバージョンを使用しString.format(${word_selection}${},)${cursor}ます:最初に文字列を選択し、次に 'sf'を使用します。%sなどを追加します...
Christophe Roussy 2014年

8

現在のディスプレイから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;
}

3
簡単な注記-Joshua Blochとして知られるMaestroによると、Javaでシングルトンを作成するには、Enumを使用することをお勧めします。
パブロジム2009

こんにちはPablojimです。このテンプレートを投稿してから、Effective Javaを読み始め、シングルトンの実装を列挙型に変更しました。それでも、テンプレートで列挙型を生成し、クラス宣言を変更する方法が見つかりませんでした。このテンプレートをお持ちですか?ありがとうManu
Manuel Selva

参考までに、これが列挙型シングルトンパターンelectrotek.wordpress.com/2008/08/06/…です。特に好きではありませんが、シングルトンは多くありません。これをJavaテンプレートに変換するのは簡単です。
pjp 2009

1
列挙型アプローチの場合、多くのシングルトンが対応していないため(そして、この「...アプローチはまだ広く採用されていない」のはなぜだと思いますか?シングルトンクラスには意味があり
ませ

シリアライズ可能?はい。シングルトンへの参照を持つオブジェクトのシリアル化を検討してください。シリアライズ可能でない場合は、NPEが発生する可能性があります。そうである場合(およびデフォルトの逆シリアル化を上書きするメソッドを追加しない場合)、「シングルトン」の別のインスタンスを取得する可能性があります。
Johannes Kuhn

8

そして、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);
}

リフレクションのない解決策については、リンクの
gswierczynski 14

8

ロガー宣言のテンプレートは素晴らしいです。

また、頻繁に使用するログレベルのlinfo、ldebug、lwarn、lerrorも作成します。

lerror:

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

8

イベントのすべてを作成する

イベントは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使用中にIを加えて、変更することはできませんsynchronizedリスト自体にロック、リスナーのリストがアクセスまたは使用されているブロック。


ロック状態(同期またはその他)でイベントを送信すると、デッドロックが発生するのを待ちます。この場合、同期されたブロック内でリスナーをコピーし、新しいリストを繰り返した方がよいでしょう。
ssindelar 2015年

ConcurrentLinkedQueueを使用します。弱い整合性のあるイテレーターがあり、ConcurrentModificationExceptionをスローしないため、ロックは必要ありません。
Stefan Dollase

8

テストメソッドを挿入する必要があります。

最近、このバージョンに似たバージョンを見て、非常に優れた開発者や友人とプログラミングを組み合わせていました。このリストに追加するとよいでしょう。

このテンプレートは、コードを構造化するためのガイドとして、コメントのビヘイビア駆動開発(BDD)パラダイムから「Given-When-Then」アプローチに従って、クラスに新しいテストメソッドを作成します。メソッド名は「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)}

私はそのテンプレートが好きです。テストをさらに快適にするために、「スロー例外」を追加しました。
Torsten

BDDパラダイムが好きです。そのための非常に素晴らしいテンプレート。そしてただのメモ:あなたの非常に優れた開発者であり友人である人がいなくなりました!
bobbel 2015

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$
 */

「I ...」は、クラスが何をするかを説明するよう開発者にすぐに勧めます。ドキュメント化されていないクラスの問題を改善しているようです。

そしてもちろん$ Id $は便利なCVSキーワードです。


5

これらのスニペットを何度も使用して、null値と空の文字列を探しました。

受け取った引数をチェックするためのメソッドの最初のコードとして、「引数テスト」テンプレートを使用します。

testNullArgument

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

会社またはプロジェクトの標準に合わせて例外メッセージを変更することができます。ただし、問題のある引数の名前を含むメッセージを表示することをお勧めします。それ以外の場合は、メソッドの呼び出し元がコードを調べて、問題の原因を理解する必要があります。(NullPointerExceptionメッセージのないA は、かなり無意味なメッセージ「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」または類似のものよりもかなりおかしく、実際にユーザーに問題を理解する機会を与える可能性があります。

楽しい!


4

これをMessageFormatに使用します(Java 1.4を使用)。そうすれば、国際化を行うときに抽出するのが難しい連結がないことが確実になります。

国際化

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を使用)、またはバッファーが大きすぎるため(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();
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.