C / C ++では、メソッドの状態を維持するために静的ローカル変数を使用します。しかし、なぜJavaでサポートされていないのでしょうか。
はい、この目的で静的フィールドを使用できます。しかし、1つのメソッドの状態のみを維持するためのフィールドを作成するのは少し奇妙ではありませんか?
あなたは唯一の解決策を見つけました。
JavaはC++から多くの複雑さを取り除きました、そしてこれはそれらの1つでした。
関数にスコープされた静的変数は、並行して厄介なことをします(たとえば、strtokは、まさにこの理由で、pthreadで使用するのに厄介なものとして有名です)。
一般的に、必要なのは状態のあるオブジェクトです。問題の関数には、オブジェクトレベルの変数が必要です。次に、それぞれが状態を維持するインスタンスを作成できます。
理解/維持/などがはるかに簡単です。
本当に状態をシングルトンとして維持する必要がある場合は、静的フィールドがそれです。
Java言語仕様は、C変数に対応する変数の省略を擁護していないようですstatic
。
クラスメソッドで状態を非表示にすることには、Javaの観点から見た場合にいくつかの欠点があります。一般に、関数レベルの静的変数の存在は、その関数の外部に公開したい種類の実装の詳細ではありません。
ただし、メソッドの状態は実際にはクラスの状態の一部であり、オブジェクトが永続化されるたびに、メソッドレベルの静的変数をシリアル化/逆シリアル化する必要があります。これは一般的ではないように聞こえるかもしれませんが、Cの背景から来ているので、いくつかの一般的な例に注意します。
オブジェクトが永続化されているときに変数の値を保存する価値がある場合は、そのクラス外のコードがその値を参照する必要がある可能性が高くなります。そして突然、それはアクセスレベルを定義することを意味します-パブリックメソッドの静的変数は自動的にパブリックになりますか?それとも、プログラマーはそれを宣言する必要がありますか?
拡張性についても考える必要があります。同じ静的変数を実装するには、派生クラスが必要ですか?または、基本クラスの関数から変数への参照がありますか?
静的ローカル変数を使用するCメソッドは、Javaのクラスの候補として適している可能性が高くなります。それは状態を持っており、うまくいけば単一の目的のために存在します。機能をオブジェクトにカプセル化することにはほとんど欠点がなく、一時的な値(ローカル変数など)とより長期的な状態をより明確に分離できます。
他の回答のいくつかは、なぜこれを望まないのかを示しています。しかし、歴史的な観点からその理由を尋ねることもできます。
これに答えるには、Cが静的ローカル変数を持っている理由を理解し始める必要があります。Cは、変数のスコープを制限するためのJavaやC ++よりもはるかに少ない手段を持っています。静的データの唯一のオプションは、「ファイル内」と「どこでも」です。したがって、これにより、スコープを制限するための追加のレイヤーが提供されます。
C ++の重要な側面はとの互換性であるため、C++でも許可されています。ただし、静的データのスコープを制限する方法は他にもたくさんあるため、ローカルの静的スコープはもう必要ありません。この使用法は(最新の)C++では一般的ではありません。
JavaはC/C ++から多くのインスピレーションを得ているだけであり、下位互換性について心配する必要がなかったため、省略できます。
おそらく、メソッドはJavaのオブジェクトではないためです。したがって、あなたが言ったようにそれらの状態を維持することはあまり意味がなく、そのためにバイトコードで新しい概念を作成する必要があると思います。TonyK.が言ったようにオブジェクトを使用します。
インスタンスメソッドは、クラスのインスタンス(オブジェクト)によって呼び出されます。静的なものはオブジェクトではなくクラスに属しているため、ローカル変数は静的ではありません。インスタンス変数は静的であり、静的ブロックによるクラスのロード時に初期化することもできます。 ここに画像の説明を入力してください
詳細については、次のWebサイトをご覧ください:-https://www.youtube.com/watch?v = GGay1K5- Kcs&t = 119s