ここから本文です

Javaコーディングにおいて、 "メソッドの引数"および"メソッド内部の変更されない...

pro********さん

2014/6/200:49:46

Javaコーディングにおいて、
"メソッドの引数"および"メソッド内部の変更されないローカル変数"に、
final修飾子を付けるべきですか?

閲覧数:
125
回答数:
4
お礼:
500枚

違反報告

ベストアンサーに選ばれた回答

par********さん

編集あり2014/6/213:50:54

この問題は賛否両論あります。

finalを付けた場合のメリット
・コーディングミスを減らせる。
・インライン展開などの最適化に効果がある。

それに対する反論
・プログラマ全員に意識浸透を図るのが難しい。
・最近のJITコンパイラは賢いから無意味。かえって逆効果。
・プログラマが最適化まで意識する必要はない。

説得力のあるデータが出せないので、議論が堂々巡りです。

この回答は投票によってベストアンサーに選ばれました!

ベストアンサー以外の回答

1〜3件/3件中

並び替え:回答日時の
新しい順
|古い順

foo********さん

2014/6/711:26:29

個人裁量でいい場合、私は以下です。
a. 引数 には、いっさい付けない。
b. フィールド や メソッド内のローカル変数 には、付けることもある。

Javaのfinal修飾は、正直嫌いです。
ハンパで役に立たない。
・インスタンスへの更新を許さない(e.g. getterのみ、setter不可)
という効果を持つものであれば 使いで があるのですが、
そういう意味のものではまったくないから。
# 他言語の readonly, const の効果がほしい。

前記b.は、
・多少の保守上効果があるかも、と思うとき。
・未来の保守プログラマへの多少の意思伝達効果があるかも、と思うとき。
に、たまに。
たとえば、
・has-a 関連。 なんらかのインスタンスフィールドを、this と同一寿命で持ち、寿命中に生成し直したり nullify するつもりがいっさいないとき。
とか、
・メソッド内で、以降継続使用するimmutable定数的ローカル変数。 以後値が変わることはないぜ、そのつもりで読み進めていいからね、と意思表示したいとき。
などです。

いずれにしろ
・機械的に一律 {付ける|付けない} ことにしようぜルール
でしばるべきもんではないと思ってます。
が、お仕事によっては、
・バカな「静的コード解析ツール」のシバリ
に由来して
・チームのコーディング規則として一律ルール
を強制されることもマレにはあるので、その場合はしょうがないですね、従うしか。

kon********さん

2014/6/211:35:26

それを行うと引数やローカル変数を
「定数」のように扱うことになります。
参照型の場合、メソッド内でのフィールド
の不用意な設定による引数の参照型値の
変化を抑制することができます。
つまり、何らかのクラスインスタンス
を引数に(変更不許可の前提で)渡したが
そのメソッド内で変更されてしまった
という「事故」が減る可能性はあります。
ただ、引数は(値型を除いて)すべて
メソッド内部で直接・間接に改変される
可能性があるという前提での設計のほうが
文法的に素直になります。
ただその代わり自分の属するクラスメ
ソッドで自分自身をなるべく変化させな
いという設計(外部クラスメソッド内で
変化する)であることも同時に要求され
るのではないかと思います。
(この辺り「オブジェクト指向」とも
絡み非常に高度な話になるのではないか
と思います。正直手に負えません)

finalを付けなければならない状況は
ローカルスコープ内に作った内部クラス
のメソッドがそれを参照する場合などが
典型例です。

mei********さん

2014/6/205:55:06

fainal修飾子を理由なく使うべきでは有りません。
何のために付けるのか、目的を考えて使いましょう。
http://www.wisdomsoft.jp/125.html

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる