Intereting Posts

Android Final vs Private textviews

Простой, возможно, глупый вопрос. У меня есть активность входа, которая запускает другое действие, и вот код:

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 как private vs внутри OnCreate в качестве окончательного?

Solutions Collecting From Web of "Android Final vs Private textviews"

Это связано с закрытием на Java . В принципе, когда вы используете анонимный класс, значения (а не сами объекты), используемые в нем, копируются в этот класс для использования. Поэтому нет смысла возвращать или изменять эти переменные внутри класса, поэтому они должны быть final .

Однако, если переменная является частью класса, содержащего анонимный класс, это другое. В основном ваш внутренний класс имеет ссылку на объект LoginActivity (как LoginActivity.this ) и может использовать и изменять его элементы и методы.

Когда вы помещаете их «выше @Override», вы делаете их переменными- LoginActivity класса LoginActivity . Таким образом, они могут быть доступны анонимным классом.

Вкратце, разница в том, что: final переменные являются локальными для метода и скопированы в анонимный класс; Переменные-члены являются локальными для содержащего класса и модифицируются анонимным классом.

Если вы хотите повторно использовать данные из анонимного класса позже, используйте переменную-член. Если вам это нужно только внутри onCreate() и анонимного класса, то final переменной будет достаточно.

Когда вы объявляете поле TextView (или любое другое поле) общедоступным, к нему можно получить доступ любым другим классом, который, как я считаю, не является вашим намерением; Нет смысла публиковать переменную TextView.
Если он задан как закрытый, есть гарантия, что его значение не будет переопределено в другом классе, и это то, что было создано для последнего ключевого слова. Поэтому просто установите его как конфиденциальный, и вам не придется беспокоиться о том, что Eclipse исправляет вас.
Итак, в итоге: создание поля private / final гарантирует, что значение нельзя переопределить из другого класса, что является хорошим дизайном.

Надеюсь, что это бессвязное помогает. Я буду рад прояснить это, если это не так.