9

単純かもしれない愚かな質問。別のアクティビティを起動するログイン アクティビティがあり、コードは次のとおりです。

public class LoginActivity extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.login);
    ActionBar actionBar = getActionBar();
    actionBar.hide();

    Button btnLogin = (Button) findViewById(R.id.btnLogin);
    final TextView tvUsername = (TextView) findViewById(R.id.tvUsername);
    final TextView tvPassword = (TextView) findViewById(R.id.tvPassword);

    btnLogin.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            if (tvUsername.getText().toString().length()<1) {
                Toast msg = Toast.makeText(LoginActivity.this, "Enter a Username", Toast.LENGTH_LONG);
                msg.setGravity(Gravity.TOP|Gravity.LEFT, 0, 70);
                msg.show();
                tvUsername.requestFocus();
            } else if (tvPassword.getText().toString().length()<1) {
                Toast msg = Toast.makeText(LoginActivity.this, "Enter a Password", Toast.LENGTH_LONG);
                msg.setGravity(Gravity.TOP|Gravity.LEFT, 0, 200);
                msg.show();
                tvPassword.requestFocus();
            } else {
                startActivity(new Intent(LoginActivity.this,CrewScheduleActivity.class));
                finish();
            }
        }
    });
    }
}

私の質問はテキストビューについてです。Eclipseは基本的に、ボタンのonClickイベントでそれらを使用するためにそれらを最終的にしなければならないと言いました。NPだから私はそれをしました、そしてそれはうまくいきました。

問題は、これらを @Override の上にプライベートとして配置することと、OnCreate 内に最終的に配置することの違いは何ですか?

4

2 に答える 2

7

これはJava のクロージャに関係しています。基本的に、匿名クラスを使用すると、その中で使用される値 (オブジェクト自体ではない) がそのクラスにコピーされて使用されます。したがって、クラス内でこれらの変数を返したり変更したりすることは意味がありませんfinal

ただし、変数が代わりに匿名クラスを含むクラスの一部である場合、それは異なります。基本的に、内部クラスはLoginActivityオブジェクトへの参照 ( as LoginActivity.this) を持ち、そのメンバーとメソッドを使用および変更できます。

それらを「@Overrideの上」に配置すると、LoginActivityクラスのメンバー変数になります。したがって、匿名クラスからアクセスできます。

簡潔に言うと、違いは次のとおりです。final変数はメソッドに対してローカルであり、匿名クラスにコピーされます。メンバー変数は、含まれているクラスに対してローカルであり、匿名クラスによって変更されます。

匿名クラスのデータを後で再利用する場合は、メンバー変数を使用します。onCreate()匿名クラス内でのみ必要な場合は、final変数で十分です。

于 2012-11-24T03:35:13.303 に答える
3

TextView フィールド (またはそのフィールド) を public として宣言すると、他のクラスから直接アクセスできますが、それはあなたの意図ではないと思います。TextView 変数を公開する理由はありません。
プライベートとして設定されている場合、その値が別のクラスでオーバーライドされないことが保証されます。これは、最初にfinalキーワードが設計された目的です。したがって、単純にプライベートとして設定すれば、Eclipse が修正することを心配する必要はありません。
つまり、要約すると、フィールドを private/final にすることで、値が別のクラスからオーバーライドされないようにすることができます。これは優れた設計です。

このとりとめのないことが役立つことを願っています。そうでない場合は、それをより明確にしていただければ幸いです。

于 2012-11-24T03:37:07.440 に答える