- PR -

superやthisなどの修飾子についてお聞きします

投稿者投稿内容
さる
ぬし
会議室デビュー日: 2005/07/14
投稿数: 276
お住まい・勤務地: 実家戻ったw
投稿日時: 2007-04-24 14:41
引用:

nagiseさんの書き込み (2007-04-24 13:55) より:
thisがついていない場合、それがstaticな変数・メソッドなのか、
インスタンスの変数・メソッドなのかが一見して分かりません。



普通にJavaのコーディング規約に沿って開発していれば、
クラスとインスタンスの違いは一目で分かるような・・・
1文字目が大文字か小文字で見分けられるかと。
こくぼ
大ベテラン
会議室デビュー日: 2003/08/11
投稿数: 229
お住まい・勤務地: 国境の南、太陽の西。
投稿日時: 2007-04-24 14:54
ぼくはEclipseとかNetBeansで、コード補完が簡単になるので「必ず付ける派」ですねー。
インスタンス変数/メソッド両方とも毎回this.とタイピングしてからコード補完させてます。

コードリーディングするときもthisがついてた方がなんとなく安心感があるし。
付けなくてよいものを付けたくないって人の気持ちもわかりますけど。

_________________
『Life's rich Tapestry!!』
taku
ぬし
会議室デビュー日: 2002/11/12
投稿数: 918
お住まい・勤務地: 墨田区→中野区
投稿日時: 2007-04-24 14:59
 弊社ではthisもsuperも付けるようになっていますが私は反対派です。
あと、「java.lang.*」を明示的にインポートしたりしないで欲しいです・・・。
弊社の人達はデフォルトで行われる事が嫌いで、
明示的にコードを直接記述したいようです。
fyiru
会議室デビュー日: 2007/04/24
投稿数: 2
お住まい・勤務地: 港区
投稿日時: 2007-04-24 14:59
多くの返答有難うございます。

パフォーマンスは変わらないとの事なので自分の中では一安心です。

私の場合ですが、thisをつけるのは同インスタンス内で作成されたインスタンス変数であるとぱっと見て判断できるようにする為です。
Eclipseを使用している場合、色をつけたり斜文字にする事が可能ですのでいいのですが、急を要する場合に、メモ帳で行わなくてはならない場合等、ローカル変数なのかインスタンス変数なのかを判別するのが楽だという点もあります。

引用:

さるさんの書き込み (2007-04-24 14:41) より:
普通にJavaのコーディング規約に沿って開発していれば、
クラスとインスタンスの違いは一目で分かるような・・・
1文字目が大文字か小文字で見分けられるかと。


すいません。Java本来のコーディング規約というものを十分に把握していなくて…。
checkStyleを導入した際に、大文字から始まる変数はすべて警告にされていたと思っていたので、大文字からのインスタンス変数は基本として使用してないですね…。勘違いだったのかもしれないですね…。


superの修飾子に関してなのですが、例文としまして
public class oya {

protected String a;

}

public class ko extends oya {

public void method() {
String strA = super.a;
String strB = a;
}
}

という形で、strAとstrBで同じ意味になると思います。
この場合、つけるべきかどうか…だったので、thisと同じで明示的…ぐらいにしかとらえていませんでした。

オーバーライドの際、どういった問題が出てくるのかというのがまだ頭の中で整理できていませんので、少し見直してみます。mioさん有難う御座います。
さる
ぬし
会議室デビュー日: 2005/07/14
投稿数: 276
お住まい・勤務地: 実家戻ったw
投稿日時: 2007-04-24 15:24
引用:

fyiruさんの書き込み (2007-04-24 14:59) より:
引用:

さるさんの書き込み (2007-04-24 14:41) より:
普通にJavaのコーディング規約に沿って開発していれば、
クラスとインスタンスの違いは一目で分かるような・・・
1文字目が大文字か小文字で見分けられるかと。


すいません。Java本来のコーディング規約というものを十分に把握していなくて…。
checkStyleを導入した際に、大文字から始まる変数はすべて警告にされていたと思っていたので、大文字からのインスタンス変数は基本として使用してないですね…。勘違いだったのかもしれないですね…。



普通と言う言い方が悪かったですね、
まあ、色々な所が色々なJavaのコーディング規約を設定しているんですが、
まあ、中身は大体似ているのかなと。
Sunが有名ですかね。
http://java.sun.com/docs/codeconv/
で拾えるんで拾って読んでみて下さいな。

日本語訳なら
http://www.tcct.zaq.ne.jp/ayato/programming/java/codeconv_jp/

【編集】
日本語訳のURLを貼った。

[ メッセージ編集済み 編集者: さる 編集日時 2007-04-24 15:27 ]
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2007-04-24 16:12
privateじゃないフィールドはカプセル化を壊しやすいので、
かなり注意して使わないと、親クラスで予期しないバグを起こしやすいです。

ですので、私は基本的に使わないので、
superを付けてフィールドを参照することはありませんね。

fyiruさんの例においては意味が同じではなく、
たまたまそのコードにおいて参照する先が同じになっただけです。

話がそれますが、
引用:

あと、「java.lang.*」を明示的にインポートしたりしないで欲しいです・・・。


*を使っているだけで、既に明示的になっていないような・・・
import java.lang.*;はちょっと悲しくなりますねww
taku
ぬし
会議室デビュー日: 2002/11/12
投稿数: 918
お住まい・勤務地: 墨田区→中野区
投稿日時: 2007-04-24 16:29
引用:

かつのりさんの書き込み (2007-04-24 16:12) より:
話がそれますが、
引用:

あと、「java.lang.*」を明示的にインポートしたりしないで欲しいです・・・。


*を使っているだけで、既に明示的になっていないような・・・
import java.lang.*;はちょっと悲しくなりますねww


 明示的にと言っているのはクラスの事ではなく、パッケージの事です。
勿論、Integer等のクラス単位でインポートもNGです。
Javaではjava.langパッケージは、自動的にインポートされますからね。
ちょっと言葉足らずでしたね。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-04-24 16:35
引用:

さるさんの書き込み (2007-04-24 14:41) より:
引用:

nagiseさんの書き込み (2007-04-24 13:55) より:
thisがついていない場合、それがstaticな変数・メソッドなのか、
インスタンスの変数・メソッドなのかが一見して分かりません。



普通にJavaのコーディング規約に沿って開発していれば、
クラスとインスタンスの違いは一目で分かるような・・・
1文字目が大文字か小文字で見分けられるかと。



メソッドは当然分かるのですが、問題はフィールドですね。
static finalなものは命名規約が違うので分かりやすいのですが、
インスタンスのフィールドもstaticなフィールドも名称は変わりません。
コード:
public class Hoge {
  private Object hogeInstance = new Object();
  private static Object hogeStatic = new Object();

  public static void main(String[] args) {
    Hoge hoge = new Hoge();
    System.out.println(hoge.hogeInstance); // インスタンス変数へのアクセス
    System.out.println(hoge.hogeStatic); // 一見して分からないが実はスタティック変数へのアクセス
  }
}



教育期間にある新人プログラマにはthisを付けるように指導しています。
thisを付けさせることで、それがインスタンス対する操作なのか、
クラスにたいする操作なのかを意識させることが重要だと思います。

インナークラスの扱いを教える際にはthisの前のクラス名も省略しないように指導しています。
このあたりは「分かっているから省略しても良い」のであって分かるまでは省略しないほうがよいでしょう。

コード:
public class Outer {
  int outerField;

  public void test() {
    Inner inner = this.new Inner(); // thisオブジェクトを外側のインスタンスとしてInnerクラスをnew

    Outer anotherOuter = new Outer();
    Inner anotherInner = anotherOuter.new Outer(); // インスタンス指定でのInnerクラスのnew
  }

  class Inner {
    int innerField;

    public void test() {
      System.out.println(Outer.this.outerField); // 外側のクラスのフィールドにアクセス
      System.out.println(Inner.this.innerField); // 内側のクラスのフィールドにアクセス
    }
  }
}



どういうルールで省略されるのか、そらんじていえる方が混同しにくい場所で
省略した記法を用いることはなんら問題ありません。

どうやったらそこまで早く到達できるかといえば、まずは省略されているものを
省略しないで、そこで何が行われているかを理解することでは無いでしょうか?

importにしても、まずは絶対名を覚えてからimportを覚えないといけませんよね。
java.util.Listとjava.awt.Listを一緒に使いたいとか、そういうときに
うろたえているようでは困るのです。

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