7

新しいクラスを作成するときはいつでも、クラスのプロパティを記述するためにかなりの量のクラス変数を使用します。入力したコードを確認するために戻ると、40〜50のクラス変数が表示されます。それらがパブリック、保護、またはプライベートのいずれであっても、それらはすべて、私が定義したクラス全体で目立つように使用されます。

クラス変数は、ブール値、整数、倍精度浮動小数点数など、ほとんどがプリミティブ変数で構成されていますが、クラス変数が大量にあるクラスの一部がパフォーマンスに影響を与える可能性があるという不安感がありますが、無視できる程度です。多分。

しかし、可能な限り合理的であるため、無制限のRAMサイズと無制限のJavaクラス変数を考慮すると、Javaクラスは、RAM内の無限に大きなメモリブロックである可能性があり、ブロックの最初の部分にはクラス変数パーティションが含まれ、残りの部分にはクラス変数パーティションが含まれます。ブロックには、Javaクラス内のクラスメソッドへのアドレスが含まれています。この量のRAMを使用すると、そのパフォーマンスは非常に重要です。

しかし、それは私の気持ちを言ったよりも簡単にするものではありません。RAMが制限されているが、Javaクラス変数が無制限であると考えると、結果はどうなるでしょうか。パフォーマンスが重要な環境では、実際に何が起こるでしょうか。

そして、おそらく前もって言及されるかもしれませんが、クラス変数がたくさんあることがJavaの悪い習慣としてカウントされるかどうかはわかりません。それらすべてが重要であり、すべてのクラスがリファクタリングされている場合です。

前もって感謝します。

4

7 に答える 7

19

パフォーマンスは、オブジェクトが持つフィールドの数とは関係ありません。もちろん、メモリ消費は潜在的に影響を受けますが、変数が必要な場合は、それについて多くを行うことはできません。パフォーマンスについてはあまり気にしないでください。コードをシンプルで読みやすく、保守しやすく、テスト済みにします。次に、パフォーマンスの問題に気付いた場合は、測定とプロファイリングを行って問題の原因を確認し、必要に応じて最適化します。

ただし、保守性と可読性は、オブジェクトが持つフィールドの数に影響されます。40から50のフィールドは非常に多くのフィールドであり、おそらくクラスがそれ自体でやりすぎであり、責任が多すぎることを示しています。それらを多くのより小さなサブクラスにリファクタリングし、構成を使用することはおそらく良い考えです。

于 2012-08-08T08:45:06.713 に答える
5

私はお尻のように聞こえないことを願っていますが、私の見解では、クラスに10を超えるプロパティがあることは、通常、悪い設計のヒントであり、正当化が必要です。

パフォーマンスの面では、これらすべてのプロパティが頻繁に必要になる場合は、各オブジェクトにもヘッダーがあるため、メモリを節約できます。したがって、5〜10のクラスを使用するのではなく、すべてを1つにまとめて、バイトを節約します。

使用するガベージコレクターによっては、オブジェクトを大きくすると、割り当てるコストが高くなる可能性があります(これは、CMSガベージコレクターには当てはまりますが、並列のガベージコレクターには当てはまりません)。より多くのGC作業=アプリの実行時間の短縮。

トラフィックが多く、レイテンシが低いアプリケーションを作成しているのでない限り、クラスが少ない(そしてメモリの使用量が少ない)という利点は、メンテナンスに必要な余分な労力に完全に圧倒されます。

于 2012-08-08T08:45:39.677 に答える
3

多くの変数を持つクラスを持つことで私が目にする最大の問題はスレッドセーフです-そのような場合の不変条件について推論するのは本当に難しいでしょう。また、そのようなクラスを読んだり維持したりするのは本当に難しいでしょう。

もちろん、フィールドをできるだけ不変にすると、それははるかに良くなります。

私は一緒に行こうとします:少ない方が良いです、維持するのは簡単です。

于 2012-08-08T08:45:55.047 に答える
1

私たちが常に教えられている基本原則は、結束を高く保ち (1 つのクラスが 1 つのタスクに集中する)、結合を低く保つ (1 つの変更が他のクラスに影響を及ぼさないように、クラス間の相互依存を少なくする) ことです。

システムを設計するときは、メンテナンスしやすい設計に重点を置くべきだと思います。パフォーマンスは自然に解決します。これは要件に厳密に依存するため、クラスが適切な方法として持つことができる変数の数に固定の制限があるとは思いません。

たとえば、アプリケーションが学生にコースを提案するという要件があり、アルゴリズムが 50 個の入力 (スコア、趣味など) を必要とする場合、このデータが 1 つのクラスで利用可能か複数のクラスで利用可能かは問題ではありません。実行を高速化するために RAM にロードされます。

もう一度言いますが、設計に気をつけてください。不必要な変数をクラスに保持すること (不要な情報を RAM にロードするため) と、必要以上のクラスに分割すること (より多くの参照とそれによるポインターの移動) の両方が有害です。

于 2012-08-08T09:00:23.397 に答える
1

1.私は常にこれを大まかなルールとして使用しています。クラスが変更する理由は 1 つだけである必要があるため、1 つのことだけを行う必要があります。

2.これを念頭に置いて、このクラスの属性を定義するために必要な変数を取得します。

3.クラスが に従っていることを確認します。クラスCohesive principleのメソッドはクラス名を反映しています。

4.すべてを整理した後、クラスを解決するために他の変数が必要な場合は、それらを使用する必要があります.選択の余地はありません.いくつかの追加変数による影響はほとんどありません。

于 2012-08-08T09:08:32.867 に答える
0

クラス変数は、製品名、バージョン、OS バージョンなどのデフォルト文字列を保存するための静的最終定数として使用されることがあります。または、フォント サイズ、タイプなどの製品固有の設定を保存するためにも使用されます。これらの静的変数は、クラス レベルで保持できます。

フィールド定数を格納したいだけの場合や、めったに変更されない製品設定が必要な場合は、単純なクラスの代わりに HashMap を使用することもできます。これにより、応答時間を短縮できます。

于 2012-08-08T10:24:07.600 に答える
0

私が言及したい2つのこと:1.すべてのインスタンス変数はRAMのヒープ領域に保存されます.2.すべての静的変数は非ヒープ領域(具体的にはメソッド領域)に保存されます。

変数のタイプ (インスタンスまたは静的) が何であれ、最終的にはすべて RAM に存在します。

今あなたの質問に来ます。インスタンス変数に関する限り、Java のビルトイン ガベージ コレクタは、ほとんどの場合、メモリを解放し続けるために適切かつ効果的に機能します。ただし、静的変数はガベージ コレクションされません。

クラスに多数の変数があるためにメモリの問題が非常に懸念される場合は、従来の強参照の代わりに弱参照を使用することができます。

于 2012-08-08T10:39:59.910 に答える