- PR -

C#でJavaのfinalの1機能を使いたい

投稿者投稿内容
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-12-24 12:30
引用:

Tdnr_Symさんの書き込み (2005-12-24 12:06) より:

メモリの節約になるわけでもないし、
ローカルスコープにしか影響しないからバグ回避に役立つわけでもないし…
 :


私の引用から返信しているわけですが、
そんなこと私言いましたっけ? (^^;)

引用:

正直言って、それほどバグ減少に効果なさそうな気がします(~_~;)
引数にfinalが付いていようと付いていなくても、
func1メソッドのスコープ内だけの問題ですよね!?


内だけの問題ですし、バグ減少に直接効果があるわけではないでしょう。

検証のターゲットが不変であることを示すために使うことはあります。
業務系アプリで特別な検証メソッドを書く場合に、
他の人が妙な修正をしないようにと、保険で書くことくらいはありますね。

ただ、プリミティブ型に対してそんなことする人は普通はいない...
(いや、過去にやられたことがあるんですがw)

それと、final を付けて明示化する (おまじない?) ことが良いかは人次第だと思います。

[ シグネチャを削除 ]

[ メッセージ編集済み 編集者: じゃんぬねっと 編集日時 2006-10-12 11:42 ]
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2005-12-24 12:32
コード:
引数が final でなくとも、参照したい引数を final 変数に渡せば可能ですね。 
ということは、C# で言えば const なローカル変数を使えば良いという話になります。


javaの場合は、参照渡しはありませんので無理ですね。

finalは参照(プリミティブ型は値)が変更されない事を保障するものであって、
内部の値が変化することは保障されていません。
例えば、
コード:
//OK
final int[] values = new int[]{1,2,3};
values[1] = 100;

//NG
final int[] values = new int[]{1,2,3};
values = new int[]{2,3,4};


のような動きになります。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-12-24 12:55
引用:

かつのりさんの書き込み (2005-12-24 12:32) より:

javaの場合は、参照渡しはありませんので無理ですね。


質問者の例では無理ですわね...

コード:

    private void addDialog(Button button, Dialog dialog) {
        final Dialog dialog_ = dialog;

        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                dialog_.setVisible(true);
            }
        });
    }


引用:

のような動きになります。


ええ、このあたりは、C#, VB.NET の readonly な参照型と同じなんですよねぇ。

# 部分的に答えていたので、話がややこしいことになってしまった... orz

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2005-12-24 12:58
こんにちは。

引用:

じゃんぬねっとさんの書き込み (2005-12-24 12:30) より:
引用:

Tdnr_Symさんの書き込み (2005-12-24 12:06) より:

メモリの節約になるわけでもないし、


私の引用から返信しているわけですが、
そんなこと私言いましたっけ? (^^;)



いえスレッドに「メモリ節約」の話題が出ていたので書きました。
じゃんぬねっとさんが発言されたように誤解される書き方でしたかね(~_~;)

じゃんぬねっとさんから「C++のconst引数」の話題が出ていたので、
便乗して、説明させていただきました。
別にじゃんぬねっとさんに反論して書いたわけではないですよ(~_~;)
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 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 を挿入してくれたり(これはやりすぎか?)、のほうが実用的だと思います。
梅吉
会議室デビュー日: 2003/08/19
投稿数: 16
投稿日時: 2005-12-25 11:48
多々のご回答ありがとうございます。


引用:
javaの場合は、参照渡しはありませんので無理ですね。


参照渡しされる配列やArrayListなどへの対応策も「Java魂」に記述されています。


引用:
私は、Java の final も C++/C# の const も、あまり保護には役立たないと感じています。
たとえば変数に final/const を付けたことで、その変数に後で別の値を代入しようとすることがエラーとなって、コーディングの間違いを検出できても、あまり嬉しくありません。そんなケアレスミスをおかすということは、他の場面でもっとひどい間違いをたくさんしてしまっているはずです。


それを言ってしまったらすべてが終わってしまうかと思います。
1つでもバグの可能性を消していくコーディングが(簡単に)出来るように
なるべきだと思います。それには言語・IDEの向上が必須だと思っています。
そういう意味で以下には大賛成です。


引用:
逆に、コンパイラーが、final/const である旨の印を付けて IDE 上でハイライトで表示してくれたり、ソースコードに final/const を挿入してくれたり(これはやりすぎか?)、のほうが実用的だと思います。


上記の前半は大賛成です。
に。
会議室デビュー日: 2007/08/06
投稿数: 1
投稿日時: 2007-08-06 04:10
横からすみません。

引用:

unibonさんの書き込み (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 を挿入してくれたり(これはやりすぎか?)、のほうが実用的だと思います。



どうせ後で誰かが読むのだろうから、後に変更されない(宣言以降変更されない)ことを明示的に示すためにfinalやconstなどをつけるのは、賢明だと思います。
もっとも、最初に書く人も後に読む人も、一つの変数は一つの目的に使うことを心がけていれば、そんなことはしなくても良いと思いますが。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2007-08-16 11:23
(10日遅れで気づきましたが、でも、早いほうですよね。 )
引用:

に。さんの書き込み (2007-08-06 04:10) より:
どうせ後で誰かが読むのだろうから、後に変更されない(宣言以降変更されない)ことを明示的に示すためにfinalやconstなどをつけるのは、賢明だと思います。


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# の言語仕様ではそうなっていません。

引用:

に。さんの書き込み (2007-08-06 04:10) より:
もっとも、最初に書く人も後に読む人も、一つの変数は一つの目的に使うことを心がけていれば、そんなことはしなくても良いと思いますが。


使い捨て変数が一目で分かるようにするようなコーディングルールを付けたり、言語仕様になっているほうが、final/const に拘るよりは良いかもしれないと思います。

--
unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86}

スキルアップ/キャリアアップ(JOB@IT)