9

有名な書籍Java Concurrency in Practiceの章 3.4.1 Final fieldsから

可視性を高める必要がない限り、すべてのフィールドを非公開にするのが良い習慣である[EJ Item 12] のと同様に、可変にする必要がない限り、すべてのフィールドをfinalにするのも良い習慣です。

Java での最終参照に関する私の理解: 最終参照/フィールドは、フィールドが再初期化されるのを防ぐだけですが、変更可能なオブジェクトを参照している場合でも、その状態を変更して変更可能にすることができます。そのため、上記の引用を理解するのに苦労しています。どう思いますか ?

4

5 に答える 5

14

final フィールドを使用すると、フィールド自体を変更できなくなります (他のインスタンスを「指す」ようにすることにより) が、フィールドが変更可能なオブジェクトへの参照である場合は、これを行うことを止めるものは何もありません。

public void someFunction (final Person p) {
    p = new Person("mickey","mouse"); //cant do this - its final
    p.setFirstName("donald");
    p.setLastName("duck");
}

上記の参照 p は不変ですが、参照が指す実際の Person は変更可能です。もちろん、次のようにクラス Person を不変クラスにすることもできます。

public class Person {
    private final String firstName;
    private final String lastName;
    public Person(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }
    //getters and other methods here
}

このようなクラスは、一度作成すると、いかなる方法でも変更できません。

于 2013-02-09T12:14:51.530 に答える
3

この引用は、次のことだけを述べています。

変更可能にする必要がない限り、すべてのフィールドを final にする

可変フィールドは、後で別のオブジェクトを指すように変更できるフィールドです。フィールドが の場合、final変更可能なオブジェクト (例: ) を引き続き参照できますjava.util.Date。したがって、フィールドは不変 (常に同じオブジェクトを指す) ですが、このオブジェクトは変更可能です。

于 2013-02-09T12:15:36.463 に答える
2

Java final では、これに似ています。

int *const p=&something //constant pointer.in c++. you can't use this pointer to change something but that something can be changed with its own.

Java final フィールドでは変更できませんが、それらが参照するオブジェクトは独自に変更される場合があります。元。'this'final は何も割り当てることはできませんがthis、これが参照するオブジェクトに割り当てることはできます。

質問から:

it is a good practice to make all fields final unless they need to be mutable.

オリジナルへの(論理的または偶発的な)変更を避けるために、それらを最終的なものにすることは常に良いことです。

于 2013-02-09T12:23:11.180 に答える
0

Javaコードの慣習に従って、最終変数は定数として扱われ、すべて大文字で記述されます。

private final int COUNT=10; // immutable -> cannot be changed

コレクション参照変数を final にするということは、参照のみを変更することはできず、コレクション内のオブジェクトを追加、削除、または変更できることを意味します。例えば:

private final List Loans = new ArrayList();
list.add(“home loan”);  //valid
list.add("personal loan"); //valid
loans = new Vector();  //not valid

詳細: http://javarevisited.blogspot.com/2011/12/final-variable-method-class-java.html#ixzz2KP5juxm0

あなたの質問に答えるには: はい、正しく使用すれば。

于 2013-02-09T12:19:22.180 に答える
0

引用は無視してください。finalときどき'sでコードをブロットするメリットはほとんどありません。著者は優れた実践を目指していましたが、大規模なコードベースでは、すべてが最終的に作成されたことを確認すると、意図がわかりにくくなり、コードを読むことが難しくなり、不明瞭になり、メリットがほとんどまたはまったくない可能性があります。

2 つのアプローチ

ただし、一般的には2つの学校があります。あなたのものを選んでください:

  1. 反対、本当に必要でない限り

final1 つは、あなたが書いたコードを読んでいる人に、このフィールドが何らかの意味で特別であり、些細なことではないことを本当に知ってもらいたい場合を除いて、使用しないことです。

  1. なぜなら、ファイナルを使うのに悪い場所は決してないからです!

もう一方は夢中にfinalなり、どこでもそれを望んでいます。あまり普及していません。Renauld Walduraは、このアイデアの優れた宣伝者です。「最終的なキーワードの最終的な言葉」というタイトルの彼のリンクされたエントリを読んでください。これは、優れた詳細な読み物です。

使用するJavaに依存する場合があります

Heinz Kabutz の Java Specialist Newsletterfinalで読むことができるように、私はそれが変更されたことを知ってもらいたいだけであり、常に不変を意味するわけではありません。彼は、さまざまな Java でどのように機能するかを説明してくれます。自由に彼のコードを取得して、使用している Java を確認してください。

于 2013-02-09T12:49:10.900 に答える