- - PR -
変更しない変数にfinalを付けるべきですか?
投票結果総投票数:69 | |||
---|---|---|---|
必須 | 2票 | 2.90% | |
望ましい | 25票 | 36.23% | |
場合による | 7票 | 10.14% | |
どっちでもいい | 1票 | 1.45% | |
付けなくていい | 28票 | 40.58% | |
付けないほうがいい | 4票 | 5.80% | |
付けるな | 0票 | 0.00% | |
絶対に付け | 2票 | 2.90% | |
|
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-04-05 11:39
全部の投稿を追えているわけではないのですが、「付けなくていい」に一票いれました。
既に出ている大方の意見と一緒ですが、 ・インスタンスの中身そのものを保護することを保証できるわけではない ・引数の変数に代入できてしまうことに起因するバグは希なので、final をいちいち付けることによるコストに見合わない ・つける習慣がない といった理由からです。 現状インスタンスの状態を変えてしまうメソッドと、変えないメソッドをコンパイラに区別させる方法がありませんから、誤って引数のインスタンスを汚してしまうことをコンパイラレベルで防止させることはできませんね。 もしアノテーションなどでインスタンスを汚すメソッドなのか、そうでないのか宣言できるような規約があったとしてもイチイチ宣言するのは面倒すぎるのでつかわないと思います・・・。 [ メッセージ編集済み 編集者: インギ 編集日時 2007-04-05 11:40 ] | ||||||||
|
投稿日時: 2007-04-05 11:43
参考にどうぞ。
http://javafaq.jp/S012.html#S012-15 | ||||||||
|
投稿日時: 2007-04-05 11:50
私はコーディング標準として「絶対 final を付けろ」を入れています。
私自身*に*は必要ないと思っています。ですが、変なバグを埋め込む人が いるのでこうしています。 引数にパスが渡されるメソッドの仕様変更で、パスを保存しておく処理が追加になった。
と追加するわけです。普通ならこれでいけると思うんですが、要求通りに動かない。 よくよく調べると、
という処理が入っていた、なんてことがたまにあります。 スキルの低い開発者に自由にさせない「縛り」の一つとして、final を徹底させて います。 | ||||||||
|
投稿日時: 2007-04-05 12:44
「付けないほうがよい」にしました。
私自身は、インギさんとまったく同じ理由で付けてないのですが
と思ってる人がいるのであれば、付けることで不変オブジェクトになると勘違いされると 困るので、逆に付けない方が良いと思いました。 ※Effective Java読むまで私もインスタンス変数全部にfinalを付ければ、 不変オブジェクトになると勘違いしてましたし・・・<防御的コピーが必要です もちろん、代入を防止させるためであれば、付けるべきだと思います。 | ||||||||
|
投稿日時: 2007-04-05 13:15
finalを付ける事で、ちょっとfinalの動作を知り始めた人にとっては、 かえって間違えを誘発させる危険性もあるということですね、なるほど。 やはり、不変とすることができる識別子を言語仕様に追加してもらうの が一番良いみたいですね。 PHP5の__setみたいな仕組みがあれば、変更の許可・不許可を柔軟にコントロール できるかもしれない。 | ||||||||
|
投稿日時: 2007-04-05 13:27
classキーワードへの修飾子immutableを新設し、immutable classは インスタンス変数が全てfinalである必要がある、といった具合でしょうか。 setter以外にも内部状態を変更させるメソッドが存在しえますから 外からインスタンスの不変を保障することは論理的に不可能に思えます。 いや、まてよ。 アノテーション@immutableを用意して、クラス側で状態変更を伴わない メソッドをマーキングしておけば、immutableとされた変数が 状態変更を伴うメソッドの呼び出しをするのを防げるかもしれませんね。 | ||||||||
|
投稿日時: 2007-04-05 13:34
この案、面白いですね。 __set()に加えて、PHP5の__call()みたいな機能が言語仕様で・・・ しつこかったですね、すみません。 | ||||||||
|
投稿日時: 2007-04-05 13:48
フィールド自体がfinalでもインスタンスの変更自体は可能なので、
再帰的に・・・となると大変っぽい感じがしますね。 |