2011年10月26日水曜日

@Override

今回はAndroidアプリ開発Tipsというより、JavaのTipsです。


@Override

メソッドをオーバーライドする際、メソッドの前に@Overrideというアノテーションを記述すると、オーバーライドしているつもりでも実はできていない(=バグがある)場合にコンパイルエラーが発生します。これにより、メソッド名や引数のスペルミスや、型の間違いを未然に防ぐことができます。

@Overrideは、JDK 1.5とJDK 1.6では若干機能が異なります。JDK 1.5では抽象クラスの拡張には対応していますが、インターフェースの拡張には対応していません。JDK 1.6でインターフェースの拡張にも対応するようになりました。

Eclipseをインストールした状態ではJDK 1.5準拠の設定になっていますので、インターフェースを拡張する際に @Override を付けるとコンパイルエラーが発生します。

EditTextButtonToastCheckBoxRadioGroup & RadioButtonの各記事で、@Overrideをコメントにしていたのはそういう理由からです。

それではRadioButtonTest1bをベースに説明していきます。


RadioButtonTest1bActivity.javaの@Override

23行目と49行目の@Overrideを有効にしてビルドします。

RadioButtonTest1bActivity.java
package jp.co.triware.samples.RadioButtonTest1b;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Toast;

public class RadioButtonTest1bActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        final Toast myToast = Toast.makeText(this, "", Toast.LENGTH_LONG);

        // ラジオグループ
        final RadioGroup rgSelect = (RadioGroup)findViewById(R.id.group_rg);
        rgSelect.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            // ラジオボタンが変更されると何番が選択されたか表示する
            @Override // コメントを外して有効に
            public void onCheckedChanged(RadioGroup group, int checkedId) {
                myToast.cancel();
                switch (checkedId) {
                case R.id.select1_rb:
                    myToast.setText("1番");
                    break;
                case R.id.select2_rb:
                    myToast.setText("2番");
                    break;
                case R.id.select3_rb:
                    myToast.setText("3番");
                    break;
                default:
                    myToast.setText("エラー");
                    break;
                }
                myToast.show();
            }
        });

        // ボタン
        Button btnWhich = (Button)findViewById(R.id.whichis_btn);
        btnWhich.setOnClickListener(new View.OnClickListener() {
            // 選択されているラジオボタンを表示する
            // 選択されていない場合は1番目のラジオボタンを選択する
            @Override // コメントを外して有効に
            public void onClick(View v) {
                myToast.cancel();
                int id = rgSelect.getCheckedRadioButtonId();
                if (id != -1) {
                    RadioButton rbSelected = (RadioButton)findViewById(id);
                    myToast.setText(rbSelected.getText());
                    myToast.show();
                } else {
                    Toast.makeText(getApplicationContext(), "何も選択されていません。1番を選択します。", Toast.LENGTH_LONG).show();
                    // 指定したIDのラジオボタンを選択する
                    rgSelect.check(R.id.select1_rb);
                }
            }
        });
    }
}

RadioGroupのOnCheckedChangeListenerはインターフェースですので、JDK 1.5では@Overrideを付けるとエラーになります。

RadioGroup.class
public class RadioGroup extends LinearLayout
{
    public static interface OnCheckedChangeListener
    {
        public abstract void onCheckedChanged(RadioGroup radiogroup, int i);
    }
    (略)
}
JDK 1.5準拠
Eclipseの設定はJDK 1.5準拠のままですので、コンパイルエラーが発生します。

JDK 1.6準拠
JDK 1.6準拠に変更するとエラーが消えました。

では次にEclipseの設定方法を説明します。JavaコンパイラーをJDK 1.5準拠にするか、JDK 1.6準拠にするかは、ワークスペース単位またはプロジェクト単位で設定できます。


ワークスペースのコンパイラー準拠レベルを変更する

  1. [ウィンドウ]メニューから[設定]を選択します。
  2. 左のメニューから[Java]の[コンパイラー]を選択します。[コンパイラ準拠レベル]が1.5になっていますね。
  3. [コンパイラ準拠レベル]を1.6に変更して[OK]をクリックします。
  4. フル・ビルド(ワークスペース全体を再ビルド)するかどうか確認のダイアログが表示されますので、必要に応じて実行してください。


プロジェクト単位でコンパイラー準拠レベルを変更する

  1. [プロジェクト]メニューから[プロパティー]を選択します。
  2. 左のメニューから[Javaコンパイラー]を選択します。
  3. [プロジェクト固有の設定を可能にする]をチェックして、[コンパイラ準拠レベル]を1.5から1.6に変更し、[OK]をクリックします。
  4. プロジェクトを再ビルドするかどうか確認のダイアログが表示されますので、必要に応じて実行してください。

0 件のコメント:

コメントを投稿