- - PR -
C#でJavaのfinalの1機能を使いたい
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-12-24 12:30
私の引用から返信しているわけですが、 そんなこと私言いましたっけ? (^^;)
内だけの問題ですし、バグ減少に直接効果があるわけではないでしょう。 検証のターゲットが不変であることを示すために使うことはあります。 業務系アプリで特別な検証メソッドを書く場合に、 他の人が妙な修正をしないようにと、保険で書くことくらいはありますね。 ただ、プリミティブ型に対してそんなことする人は普通はいない... (いや、過去にやられたことがあるんですがw) それと、final を付けて明示化する (おまじない?) ことが良いかは人次第だと思います。 [ シグネチャを削除 ] [ メッセージ編集済み 編集者: じゃんぬねっと 編集日時 2006-10-12 11:42 ] | ||||||||||||
|
投稿日時: 2005-12-24 12:32
javaの場合は、参照渡しはありませんので無理ですね。 finalは参照(プリミティブ型は値)が変更されない事を保障するものであって、 内部の値が変化することは保障されていません。 例えば、
のような動きになります。 | ||||||||||||
|
投稿日時: 2005-12-24 12:55
質問者の例では無理ですわね...
ええ、このあたりは、C#, VB.NET の readonly な参照型と同じなんですよねぇ。 # 部分的に答えていたので、話がややこしいことになってしまった... orz _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||
|
投稿日時: 2005-12-24 12:58
こんにちは。
いえスレッドに「メモリ節約」の話題が出ていたので書きました。 じゃんぬねっとさんが発言されたように誤解される書き方でしたかね(~_~;) じゃんぬねっとさんから「C++のconst引数」の話題が出ていたので、 便乗して、説明させていただきました。 別にじゃんぬねっとさんに反論して書いたわけではないですよ(~_~;) | ||||||||||||
|
投稿日時: 2005-12-24 20:06
私は、Java の final も C++/C# の const も、あまり保護には役立たないと感じています。
たとえば変数に final/const を付けたことで、その変数に後で別の値を代入しようとすることがエラーとなって、コーディングの間違いを検出できても、あまり嬉しくありません。そんなケアレスミスをおかすということは、他の場面でもっとひどい間違いをたくさんしてしまっているはずです。 また、変数の値が固定で上書きしない(final/const を付けることができる)、ということはコーディングした後になって決まることが多いと思います。あらかじめ、変数が final/const であるべき、ということはコーディング前に分かることは少ないと思います。また、final/const がなくても、コンパイラーや実行時のインタープリター・コンパイラーが final/const があるのと等価であるかどうかを検出できるはずです。 だから付けても付けなくても良い場面では、付けないようにしています。かつのりさんがご指摘されたような、付けないといけない場面でだけ付けるようにしています。 逆に、コンパイラーが、final/const である旨の印を付けて IDE 上でハイライトで表示してくれたり、ソースコードに final/const を挿入してくれたり(これはやりすぎか?)、のほうが実用的だと思います。 | ||||||||||||
|
投稿日時: 2005-12-25 11:48
多々のご回答ありがとうございます。
参照渡しされる配列やArrayListなどへの対応策も「Java魂」に記述されています。
それを言ってしまったらすべてが終わってしまうかと思います。 1つでもバグの可能性を消していくコーディングが(簡単に)出来るように なるべきだと思います。それには言語・IDEの向上が必須だと思っています。 そういう意味で以下には大賛成です。
上記の前半は大賛成です。 | ||||||||||||
|
投稿日時: 2007-08-06 04:10
横からすみません。
どうせ後で誰かが読むのだろうから、後に変更されない(宣言以降変更されない)ことを明示的に示すためにfinalやconstなどをつけるのは、賢明だと思います。 もっとも、最初に書く人も後に読む人も、一つの変数は一つの目的に使うことを心がけていれば、そんなことはしなくても良いと思いますが。 | ||||||||||||
|
投稿日時: 2007-08-16 11:23
(10日遅れで気づきましたが、でも、早いほうですよね。 )
final/const を付ける目的はつぎの2つに大きく分類できると思います。 (1) コンパイラーには無関係で、読む人用のハンガリアン記法のような、ただのコメント。 (2) 最適化やコンパイルエラーの発見に寄与するための、コンパイラーに対する指示。 読む人用のコメント(1)は、あればたしかに読むときに便利と言えば便利なのですが、細かいことでありすぎて、書くのが辛いです。これを書く手間があれば、その他のコメント書きを充実させたほうが時間を有意義に使えるのではないかと思います。 コンパイラーへの指示(2)として働くのであれば、書くときの動機付けにはなるでしょう。私が前回も述べたように、変数の値を変更不可、という目的があってソースコードを書くということはそれほど多くなく、ソースコードを書いた後で、ああ、この変数は final/const にできるなあ、というふうになりがちです。最初に final/const に決めてからソースコードを書いても、書いている内に変数の値をやっぱり変更したくなることもあります。 また、final/const が付いていれば値が変更できない変数であることは一目瞭然ですが、付いていない変数は、変更される変数なのか変更されない変数なのかが分かりません。final/const が付いて見やすいという理論ならば、non-final や variable のような修飾もあるべきだろうと考えます。final/const にできる変数には必ず final/const を付けるという決めがあるのならば、non-final/variable 修飾がなくても構いませんが、現在の Java/C# の言語仕様ではそうなっていません。
使い捨て変数が一目で分かるようにするようなコーディングルールを付けたり、言語仕様になっているほうが、final/const に拘るよりは良いかもしれないと思います。 -- unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86} |