本当に静的な静的クラスには何も問題はありません。つまり、メソッドの出力が変化する原因となる内部状態はありません。
Dice.roll()
1から6までの新しい乱数を単に返す場合、状態は変化しません。確かに、あなたはRandom
インスタンスを共有しているかもしれませんが、定義による状態の変化は、出力が常に適切でランダムになるとは考えません。また、スレッドセーフであるため、問題はありません。
多くの場合、最終的な「ヘルパー」またはプライベートコンストラクターと静的メンバーを持つ他のユーティリティクラスが表示されます。プライベートコンストラクターにはロジックが含まれておらず、誰かがクラスをインスタンス化するのを防ぐためだけに使用されます。最後の修飾子は、これが派生したいクラスではないという考えを持ち帰ります。単なるユーティリティクラスです。適切に行われれば、静的で最終的なものではないシングルトンや他のクラスメンバが存在しないはずです。
これらのガイドラインに従い、シングルトンを作成していない限り、これにはまったく問題はありません。コントローラークラスについて言及しますが、これにはほぼ確実に状態の変更が必要になるため、静的メソッドのみを使用することはお勧めしません。あなたは、静的なユーティリティクラスに大きく依存していることはできますが、できません作ること静的なユーティリティクラス。
クラスの状態の変化とは何ですか?乱数は定義上非決定的であるため、戻り値は頻繁に変更されるため、1秒間、乱数を除外します。
純粋な関数とは、決定論的な関数のことです。つまり、特定の入力に対して、1つだけの出力が得られます。静的メソッドを純粋な関数にする必要があります。Javaには、状態を保持するために静的メソッドの動作を微調整する方法がありますが、それらはほとんど良いアイデアではありません。メソッドをstaticとして宣言すると、典型的なプログラマーは、すぐにそれが純粋な関数であると想定します。予想される動作から逸脱することは、一般的に言えばプログラムでバグを作成する傾向があるため、避けるべきです。
シングルトンは、できる限り「純粋な関数」とは反対の静的メソッドを含むクラスです。単一の静的なプライベートメンバーは、クラスに対して内部的に保持されます。これは、インスタンスが1つだけであることを保証するために使用されます。これはベストプラクティスではなく、いくつかの理由で後で問題が発生する可能性があります。私たちが話していることを知るために、シングルトンの簡単な例を以下に示します。
// DON'T DO THIS!
class Singleton {
private String name;
private static Singleton instance = null;
private Singleton(String name) {
this.name = name;
}
public static Singleton getInstance() {
if(instance == null) {
instance = new Singleton("George");
}
return instance;
}
public getName() {
return name;
}
}
assert Singleton.getInstance().getName() == "George"