- 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%
  • 投票は恣意的に行われます。統計的な調査と異なり、投票データの正確性や標本の代表性は保証されません。
  • 投票結果の正当性や公平性について、@ITは一切保証も関与もいたしません。
投稿者投稿内容
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2007-04-05 17:47
引用:

あぶぽんさんの書き込み (2007-04-05 16:27) より:
コード:
Punyu getPunyu(final Fuwa fuwa)
{
    final Punyu p = new Punyu();
    fuwa.setPunyuFlg(true);  // なんでこれが通るの?
    return p;
}




思うに、つぎのような感じのことができればいいのかなあ、と思います。
コード:
Punyu getPunyu(Fuwa(prohibit .setPunyuFlg(boolean)) fuwa) {
    final Punyu p = new Punyu();
    fuwa.setPunyuFlg(true);  // 禁止されたメソッドを使っているのでコンパイルエラー
    return p;
}


(この例では引数の Fuwa クラスに対し、setPunyuFlg メソッド(その引数は boolean のバージョン)が呼ばれないことが保証される。)
immutable な使われかたを希望するならば、prohibit する setter メソッドを複数書いてもいいし、あるいはメソッドごとに setter であることが分かるフラグ(アノテーション)を付けておけば、setter というグループ指定ひとつだけでも良い、などみたいな感じで。
こんなことがどんどんできれば、引数の型情報を見るだけで、どんな使われかたがされるのかが分かって便利かもしれません。

たとえば...
(1) 特定のメソッドを呼ぶことを禁止できる。上記のコードのような感じです。委譲がどの範囲までなされるのかが分かる。たとえば引数で渡されたクラスの close メソッドが呼ばれるのか呼ばれないのかが分かるなど。
(2) 引数で渡したインスタンスをフィールドに保持することを禁止できる。引数に渡したインスタンスが渡し先で集約されるのかされないのかが分かる。

たとえて言えば、java.policy ファイルが、メソッドごとにあるような感じとも言えましょうか。

デメリットは、引数が長い。メソッドの中の実装を見たほうが速いじゃん、と言われかねない。

--
unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86}
あぶぽん
大ベテラン
会議室デビュー日: 2005/10/20
投稿数: 205
投稿日時: 2007-04-05 17:55
unibonさん、いつもありがとうございます。

いやいや、インスタンス単位でやりたいんです。

コード:
Punyu getPunyu(final Fuwa fuwa)
{
    // なにかやってる。。。
}



このコードをレビューして、

「あ、fuwaは変更されないから安心だね」

と言って、職印押して、花見にでも出かける。。。そういう生活がしたいんです!

ん?
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2007-04-05 18:14
引用:

あぶぽんさんの書き込み (2007-04-05 17:55) より:
このコードをレビューして、

「あ、fuwaは変更されないから安心だね」

と言って、職印押して、花見にでも出かける。。。そういう生活がしたいんです!


単体テストのコードを細かく書いたり、そもそも無駄に副作用を気にする
必要のある設計にならないように、設計をレビューした方がいいのでは?
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2007-04-05 19:25
設計の間違いを他でカバーしようとする、
典型的なバッドノウハウ集になっていますね

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