6

重複の可能性:
Java final 修飾子

これは好みに関するちょっとした質問です。final 修飾子の正しい使い方は何ですか?

ソースからソースに行くと、他の人よりもそれを使用する傾向があることに気付きました. メソッドのパラメーター、メソッド内の変数、および可能な限りのものに配置します。それは必要ですか、それとも私がやり過ぎているだけですか?

参照:

private final int x;
private final int y;
private final int id;
private final int width;
private final int height;

public Widget(final int id, final int x, final int y, final int width, final int height) {
    this.id = id;
    this.x = x;
    this.y = y;
    this.xmod = x;
    this.ymod = y;
    this.width = width;
    this.height = height;
}
4

5 に答える 5

5

はい、やり過ぎです。歴史的には、これによりいくつかの最適化が行われた可能性があります。たとえば、final メソッドをより簡単にインライン化できますが、最近では、メソッドを実際に final とラベル付けするかどうかに関係なく、これらの最適化のほとんどが行われます。

final を引き続き使用する必要がある場所は、クラスのほとんどのフィールド、拡張してはならない、または拡張しないクラス、オーバーライドしたくないメソッド、および匿名の内部で参照する必要があるローカル変数です。クラス。

特に、匿名の内部クラスにラップされないローカル変数やメソッド パラメーターに対して行うのはやり過ぎです。

于 2013-02-01T17:57:36.077 に答える
1

初期化後に変数を変更したくない場合、またはクラスをサブクラス化したくない場合、またはメソッドをサブクラスでオーバーライドしたくない場合はいつでも、「最終」を使用する必要があります。コンパイラの最適化に関しては、「final」キーワードを使用すると何らかの方法で役立つと思いましたが、これを読んだだけです。

よくある誤解は、クラスまたはメソッドの final を宣言すると、コンパイラが呼び出されたメソッドをインラインで直接挿入できるようになるため、効率が向上するというものです。実際、メソッドは実行時にロードされ、コンパイルされたばかりのバージョンと同じバージョンではない可能性があるため、コンパイラはこれを行うことができません。ランタイム環境と JIT コンパイラだけが、ロードされたクラスに関する正確な情報を持ち、メソッドが最終であるかどうかにかかわらず、いつインライン化するかについてより適切な決定を下すことができます。

http://en.wikipedia.org/wiki/Final_(Java)

于 2013-02-01T17:56:47.887 に答える
0

変数を毎回最終にする必要はありません。このような変数の値を変更したい場合、頭痛の種になる可能性があります。

変数finalは、それが一律に一定である場合、または変更すべきではないと思う場合にのみ、デカールする必要があると思います。

于 2013-02-01T18:39:42.380 に答える