当我必须使用最终声明

时间:2014-10-09 12:00:09

标签: java android

我编写了下一个Android代码。变量位置必须声明为final。我不明白为什么......当我使用Eclipse调试器时,它确实识别出行中的位置值:myMovieList.remove(position); ?

感谢您对此问题的帮助。 玩具

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);


        myListView = (ListView) findViewById(R.id.mylistView);
        myListView.setOnItemClickListener(MainActivity.this);

  .......
  .......
  .......
}



@Override
    public void onItemClick(AdapterView<?> parent, View view, int position,
            long id) {
        showDeleteDialog(position);
    }

    private void showDeleteDialog(final int position) {

        AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
        builder.setTitle("Delete  ??");
        builder.setMessage("Are you shure....");
        builder.setNegativeButton("No", new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
            }
        });
        builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {


                myMovieList.remove(position);
                 objAdapter.notifyDataSetChanged();

            }
        });
        builder.show();

    }

1 个答案:

答案 0 :(得分:2)

当你写下这样的东西时:

    builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            myMovieList.remove(position);
            objAdapter.notifyDataSetChanged();
        }
    });

这称为匿名内部类new DialogInterface.OnClickListener() { ... }部分),因为您隐式创建了一个不使用名称来扩展DialogInterface.OnClickListener(和覆盖方法)的类。

这个匿名内部类使用position,这超出了它的范围,所以它需要以某种方式存储它。这就是为什么它需要知道position在你声明这个匿名类的那一刻和代码确实被执行的那一刻之间不会发生变化的原因。

使用final关键字,您可以证明此变量不会发生变化,因此您允许匿名内部类在内部存储position的当前值,而不会产生任何风险以后不同步。