2

アプリケーション全体で文字列の検証に使用される StringUtil クラスを作成しました。StringUtil のコードは次のとおりです。

public class StringUtil {
    public static synchronized boolean isValidString(String string) {
        return string!= null && string.trim().length() > 0;
    }

}

このクラスでは、メソッドは文字列が有効な文字列かどうかをチェックします。このメソッドはスレッドセーフです。エンタープライズ アプリケーションでは、このメソッドにアクセスする複数のスレッドが存在する場合があります。スレッドがこのメソッドにアクセスしている場合、他のすべてのスレッドはその順番を待つ必要があります。このメソッドは、文字列の null 値をチェックするために非常に頻繁に使用されます。それで、どれが最良の選択肢です

  1. これをシングルトンとスレッドセーフにする
  2. これをインスタンスメソッドにする
  3. このタイプのオブジェクトでプールを編成する他の方法はありますか?各スレッドは1つを取得し、完了したらオブジェクトをプールに解放します.したがって、スレッドの安全性は問題ではなく、オブジェクトの作成も行われません.
  4. 同じためのオープン ソース ライブラリはありますか。
4

7 に答える 7

16

ここには状態がないため (メソッド引数のみを使用しますstring)、メソッドは本質的にスレッドセーフです。synchronizedしたがって、キーワード を使用する必要はありません。

メソッドがプロジェクト全体で使用されているstatic場合は、既に行ったように宣言することが最善のオプションです。

于 2012-09-14T08:28:59.800 に答える
7

Usually helper methods like this, are public static, and not synchronized, because the class doesn't hold state. Since it doesn't hold state neither, you don't need a pool.

I think a good example of this the apache commons StringUtils class.

I have the feeling that you're trying to use a neutron cannon to open a walnut, simplicity is king :)

于 2012-09-14T08:31:36.203 に答える
3

You could try the util classes from Apache Commons.

But you have thread-safety here anyway, since you're not manipulating anything in the class that other calls might read (i.e. you have no state).

于 2012-09-14T08:30:52.293 に答える
3

You should probably use the StringUtils class in Apache Commons.

于 2012-09-14T08:32:10.797 に答える
1

This method should not be synchronized because it does not use any class level variables. So multiple threads can concurrently access it without any problem.

Moreover forget about synchronization when you are writing code for enterprise application that is running into container. It is container's responsibility to care about thread safety. synchronized blocks just bother the container to do its job. If you need synchronization in enterprise application re-think your design and/or find other patters (there are a lot) to solve your problem.

于 2012-09-14T08:31:59.537 に答える
1

synchronizedString は不変オブジェクトなので、キーワードは必要ありません

Immutable objects are often useful because they are inherently thread-safe

public static boolean isValidString(String string) {
    return !(string== null || string.isEmpty()); //Since 1.6
}
于 2012-09-14T09:03:10.340 に答える
1

通常、ユーティリティ クラスには静的メソッドしか含まれていないため、これらのクラスがインスタンス化されるように設計されていないことを明示的に示すことを常にお勧めします。したがって、コンストラクターを非公開にします。

public class StringUtils {

  private StringUtils() {
    throw new AssertionError("shouldn't be instantiated");
  }

}

( Joshua Bloch聖書を参照してください: 項目 4: プライベート コンストラクターで非インスタンス化を強制する)

于 2012-09-14T09:14:53.843 に答える