1. ホーム
  2. java

[解決済み] パラメータを指定して実行可能?

2022-04-19 01:31:24

質問

パラメータを受け取るRunnableが必要なのですが、そのようなRunnableが実際には存在しないことは知っています。

これは、私のアプリの設計の根本的な欠陥、または私の疲れた脳のメンタルブロックを指している可能性があるので、私はここで次のようなことを達成する方法についていくつかのアドバイスを見つけることを期待しています。 なし OOの基本原則に反している。

  private Runnable mOneShotTask = new Runnable(String str) {
    public void run(String str) {
       someFunc(str);
    }
  };  

上記のようなことを実現するにはどうしたらいいか、何かアイデアはありませんか?

どのように解決するのですか?

さて、私が最初にこれを投稿してから約9年が経ちますが、正直なところ、Javaはその後何度か改良を加えています。私のオリジナルの答えを以下に残しておきますが、その中にあることを人々が実行する必要はありません。9年前なら、コードレビューの際に、なぜそうするのか疑問を持ち、多分承認したでしょうし、そうでないかもしれません。最新のラムダが利用可能な今、時代遅れのアプローチ(公平に見て、そもそも怪しげですが...)を推奨するような投票数の多い回答は無責任です。現代のJavaでは、そのコードレビューはすぐに却下され、これが提案されたことでしょう。

void foo(final String str) {
    Thread t = new Thread(() -> someFunc(str));
    t.start();
}

前回と同様、そのスレッドを有意義に処理するなどの詳細は、読者への練習として残しておく。しかし、単刀直入に言えば、ラムダを使うのが怖いなら、マルチスレッドシステムをもっと怖がるべきでしょう。

オリジナルの回答、ただそれだけです。

メソッドの中ですぐにクラスを宣言することができます

void Foo(String str) {
    class OneShotTask implements Runnable {
        String str;
        OneShotTask(String s) { str = s; }
        public void run() {
            someFunc(str);
        }
    }
    Thread t = new Thread(new OneShotTask(str));
    t.start();
}