1. ホーム
  2. java

[解決済み] Javaにおける静的クラス

2022-03-19 17:58:23

質問

のようなものはありますか? static class をJavaで作成することはできますか?

このようなクラスにはどのような意味があるのでしょうか。静的なクラスのメソッドは、すべて static もあるのでしょうか?

逆に、あるクラスにすべての静的メソッドが含まれている場合、そのクラスも静的でなければならないのでしょうか?

静的クラスは何のためにあるのですか?

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

Javaは静的な ネストされた クラスがありますが、トップレベルの静的クラスを探しているようですね。Javaにはトップレベルのクラスを静的にする方法はありませんが、このように静的なクラスをシミュレートすることは可能です。

  • クラスを宣言する final - 静的なクラスを拡張しても意味がないので、クラスの拡張を防ぎます。
  • コンストラクタを作る private - 静的なクラスをインスタンス化する意味がないため、クライアントコードによるインスタンス化を防止します。
  • 作る すべて クラスのメンバと関数 static - クラスはインスタンス化できないので、インスタンスメソッドを呼び出したり、インスタンスフィールドにアクセスすることはできません。
  • コンパイラは、インスタンス(非静的)メンバの宣言を妨げないことに注意してください。この問題は、インスタンスメンバを呼び出そうとしたときにのみ現れます。

上記の提案に基づく簡単な例です。

public class TestMyStaticClass {
     public static void main(String []args){
        MyStaticClass.setMyStaticMember(5);
        System.out.println("Static value: " + MyStaticClass.getMyStaticMember());
        System.out.println("Value squared: " + MyStaticClass.squareMyStaticMember());
        // MyStaticClass x = new MyStaticClass(); // results in compile time error
     }
}

// A top-level Java class mimicking static class behavior
public final class MyStaticClass {
    private MyStaticClass () { // private constructor
        myStaticMember = 1;
    }
    private static int myStaticMember;
    public static void setMyStaticMember(int val) {
        myStaticMember = val;
    }
    public static int getMyStaticMember() {
        return myStaticMember;
    }
    public static int squareMyStaticMember() {
        return myStaticMember * myStaticMember;
    }
}

静的クラスは何の役に立つのか? スタティック・クラスの良い使い方は、インスタンス化が意味をなさないような、一回限りのユーティリティ・クラスやライブラリ・クラスを定義することです。例えば、Math クラスは PI や E などの数学定数を持ち、単に数学的な計算を行うクラスです。このような場合にインスタンス化を要求することは、不必要であり、混乱を招くでしょう。次の例を見てください。 Math クラスと ソースコード . であることに注意してください。 final であり、そのすべてのメンバが static . Java でトップレベルクラスの宣言が許可されている場合 static であれば、Mathクラスは確かにstaticになります。