Java/tohoho

Last-modified: 2010-10-15 (金) 16:00:00

staticはCのstaticとは違う

  static final int aaa;
 Javaのstaticは、Objective-Cでいうところのクラス関数、クラス変数で、
 インスタンス化しなくても使えるということ。
 だから、定数を表すfinalと一緒に使うケースもあり得る。

インターフェースなのにextends

 インターフェースは実装するときにはimplementsを使うが、
 interface インタフェース名 extends インターフェース名
 のようにインターフェースがインターフェースを継承することがある。

配列の初期化について

 配列は宣言と同時に代入可能
 String[][] ss = {
  { "Sun", "Sunday" },
  { "Mon", "Monday" }
 };

 オブジェクトの配列を生成するには、配列生成後、
 それぞれの要素も個別に生成する必要がある。
 ClassA[] xx = new ClassA[3];
 xx[0] = new ClassA();
 xx[1] = new ClassA();
 xx[2] = new ClassA();

文字列について補足

 equalsIgnoreCaseを使うと、文字の大小を問わず、文字の比較ができる

 文字列の分割にはsplitがあるので、それを使うとよい。
 StringTokenizerクラスを使う方法もある。

例外についての補足

 どのような例外が投げられるかは、APIリファレンスのthrowsをみるとよい。

 例外時のfinallyの部分は、try内でreturnを記述しても実行される。
 throws 宣言されたメソッドは、try catch で例外を補足しないと、
 コンパイル時にエラーとなる。

スレッドについての補足

 すでに他のクラスを継承しているサブクラス(extends Threadができない)を
 スレッド化する場合、Thread クラスのサブクラスとして定義するのではなく、
 代わりに Runnable インタフェースを実装する。
 そして、Runnableを実装したクラスのインスタンスを引数にして
 Thread クラスのインスタンスを作成し、start() メソッドを呼び出す。

Synchronizedの罠

 synchronized メソッドは、常にひとつのスレッドのみがそのメソッドを
 実行すると誤解されがちだが、スレッドを実行するインスタンスが複数あれば、
 インスタンスの個数だけ多重に実行される可能性がある。
 例えば、run() メソッドを synchronized にしても、run() メソッドの
 インスタンスはスレッドの個数分 = インスタンスの個数分あるので、
 排他制御はうまく機能しない。

 解決法としては、グローバルに参照可能なロック用オブジェクトを作成し、
 排他制御を行いたい箇所で下記のように使用する方法もある。

 class Global {
  static Object lock = new Object();
 }
 class Counter {
  void countUp() {
  synchronized (Global.lock) {
  // 排他制御を行いたい箇所
  }
 }
 }