人々がこれをどのように解決するのか、私はただ興味があります。いつも同じタイプのコードを書いていることがよくあります。例えば:
new Thread() {
//...
//...
//...
//Change this line
//...
//...
}.start();
「この行を変更してください」という行を変更し続けてから、スレッドを開始します。この変更は、1 行または数行の場合があります。このコードを圧縮するにはどうすればよいですか?
人々がこれをどのように解決するのか、私はただ興味があります。いつも同じタイプのコードを書いていることがよくあります。例えば:
new Thread() {
//...
//...
//...
//Change this line
//...
//...
}.start();
「この行を変更してください」という行を変更し続けてから、スレッドを開始します。この変更は、1 行または数行の場合があります。このコードを圧縮するにはどうすればよいですか?
Cプリプロセッサを介してJavaファイルを実行できると思います...
テンプレート パターンを使用して、共通コードを含む基本クラスを作成できます。例えば:
public abstract class ThreadTemplate extends Thread
{
public void run() {
//reusable stuff
doInThread();
//more resusable stuff
}
abstract void doInThread();
}
次に、定型コードでスレッドを開始するのは次のように簡単です。
new ThreadTemplate{
void doInThread() {
// do something
}
}.start();
また、タイピングを節約するためのあまり洗練されていない解決策は、IDE のテンプレート機能を使用することです。ここでEclipseでそれらを設定するための情報を見つけることができます.Useful Eclipse Java Code Templatesで便利なもののリストを見つけることができます.
1 つの手法は、コードを匿名の内部クラスに配置し、それを残りの処理を行うメソッドに渡すことです。
interface SomeInterface {
void fn();
}
executeTask(new SomeInterface {
public void fn() {
// Change this line.
}
});
private void executeTask(final SomeInterface thing) {
Thread thread = new Thread(new Runnable() { public void run() {
//...
//...
//...
thing.fn();
//...
//...
}});
thread.start();
}
一般に、不要な場合に拡張Thread
または他のクラスを使用することはお勧めできません。
Java アノテーションを使用して定型コードを生成することができます。独自の注釈プロセッサを作成することは難しくありません。
多くのプロジェクトで使用しているものであれば、IDEで設定します。たとえば、私はEclipseを使用しており、[ウィンドウ]->[設定]->[Java]->[エディター]->[テンプレート]に移動すると、独自のテンプレートをセットアップして、オートコンプリートできます。たとえば、私は常にsysoutと入力し始めてから、Tabキーを押します。そして、eclipseには、System.out.println()に置き換えるための組み込みのテンプレートがあります。
Eclipseには多くのビルド済みテンプレートがあるので、構文の例としてそれらを見ることができます。それが使用するIDEである場合、そうでない場合は他のIDEに類似したものがある可能性があります。
これは非常に便利で、自分でたくさん書いているボイラーコード用に作成できます。
いいえ、マクロはありません。この場合、最も近い方法は、新しい Runnable インスタンスを作成し、それを独自に作成した関数または ExecutorService に渡すことです。これにより、タスクが開始されます。
Java では、主に関数へのポインターを渡すことができないため、この「ボイラープレート」コードを取り除く良い方法はありません。すべてがオブジェクトである必要があります。
Thread の場合、実装する任意のオブジェクトRunnable
をそのコンストラクターに渡すことができます。
したがって、解決策は独自のクラスを作成することです。
public class MyClass implements Runnable {
void run() {
// change this line
}
}
残念ながら、run は静的ではないため、最初に MyClass のインスタンスを作成する必要があります。
new Thread(new MyClass()).start();
MyClass とコンストラクターに変数を追加して、引数を渡すこともできます。
編集: start メソッド以上のものが必要な場合は、Thread
それ自体をサブクラス化することもできます。