匿名内部 类 和良好实践
Anonymous inner classes and good practice
我正在从一些教程中学习 Android,在使用 OnClickListeners 时,我注意到他们中的很多人都使用匿名内部 classes,如下所示:
public class MainActivity extends AppCompatActivity {
private EditText mNameField;
private Button mStartButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mNameField = (EditText) findViewById(R.id.nameEditText);
mStartButton = (Button) findViewById(R.id.startButton);
mStartButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String name = mNameField.getText().toString();
Toast.makeText(MainActivity.this, name, Toast.LENGTH_LONG).show();
}
});
}
}
在 class 中包含 class 是否被视为良好做法?或者以某种方式在某处外部定义此 class 然后引用它是否被认为更好?我该怎么做?
Inner Class
概念只有在没有现有的 Objcet
(Class) 时才出现,没有范围存在另一个 Object
(Class)。那么你可以在 Class
中创建一个 class
。
当 Java 中引入 AWT
以执行 eventhandling
时,此概念出现在 Java v1.1
中。正如您在代码中使用的那样
mStartButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
此处 Click
事件当且仅当存在 Clickable Object
时(例如:- 按钮,或任何其他 )。因此,EventListener
必须只与那些真正需要它的 components
相关联。这是有道理的...
==========Alternatives=============
您还可以将 OnClickListener()
实施到任何其他自定义 Event Handler
Class。但这将是一项非常繁忙的任务,因为如果您使用 6
(suppose) Clickable Componenets 那么您必须 write six
不同 Class EventHandler
并将此 Class
传递给
new View.OnClickListener(new CustomEventHandler())
希望你明白了。还有很多后果,但你至少应该想一想。你可能会得到你的答案。
如果你必须复制一些代码,你应该做一些重构并只在一个地方定义它。在单个 class.
中使用它的情况
public class MainActivity extends Activity {
View.OnClickListener onClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
//some code
}
};
mStartButton.setOnClickListener(onClickListener);
当您在多个 classes
中使用同一个侦听器时
public class WidelyUsedOnClickListener implements View.OnClickListener {
@Override
public void onClick(View v) {
//some code
}
}
然后在你的 Activity
WidelyUsedOnClickLister onClickListener = new WidelyUsedOnClickLister();
mStartButton.setOnClickListener(onClickListener);
我正在从一些教程中学习 Android,在使用 OnClickListeners 时,我注意到他们中的很多人都使用匿名内部 classes,如下所示:
public class MainActivity extends AppCompatActivity {
private EditText mNameField;
private Button mStartButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mNameField = (EditText) findViewById(R.id.nameEditText);
mStartButton = (Button) findViewById(R.id.startButton);
mStartButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String name = mNameField.getText().toString();
Toast.makeText(MainActivity.this, name, Toast.LENGTH_LONG).show();
}
});
}
}
在 class 中包含 class 是否被视为良好做法?或者以某种方式在某处外部定义此 class 然后引用它是否被认为更好?我该怎么做?
Inner Class
概念只有在没有现有的 Objcet
(Class) 时才出现,没有范围存在另一个 Object
(Class)。那么你可以在 Class
中创建一个 class
。
当 Java 中引入 AWT
以执行 eventhandling
时,此概念出现在 Java v1.1
中。正如您在代码中使用的那样
mStartButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
此处 Click
事件当且仅当存在 Clickable Object
时(例如:- 按钮,或任何其他 )。因此,EventListener
必须只与那些真正需要它的 components
相关联。这是有道理的...
==========Alternatives=============
您还可以将 OnClickListener()
实施到任何其他自定义 Event Handler
Class。但这将是一项非常繁忙的任务,因为如果您使用 6
(suppose) Clickable Componenets 那么您必须 write six
不同 Class EventHandler
并将此 Class
传递给
new View.OnClickListener(new CustomEventHandler())
希望你明白了。还有很多后果,但你至少应该想一想。你可能会得到你的答案。
如果你必须复制一些代码,你应该做一些重构并只在一个地方定义它。在单个 class.
中使用它的情况public class MainActivity extends Activity {
View.OnClickListener onClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
//some code
}
};
mStartButton.setOnClickListener(onClickListener);
当您在多个 classes
中使用同一个侦听器时public class WidelyUsedOnClickListener implements View.OnClickListener {
@Override
public void onClick(View v) {
//some code
}
} 然后在你的 Activity
WidelyUsedOnClickLister onClickListener = new WidelyUsedOnClickLister();
mStartButton.setOnClickListener(onClickListener);