匿名内部 类 和良好实践

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);