java 无类名实现接口_为什么很多人写 Java/Android 时,选择让同一个类实现多个接口,而不是用多个内部匿名类?...
呃…… 標題不太好。讓我在問題描述里解釋一下。
讓我以 Android 開發中一個簡單的例子說明:在一個 Activity 中有多個可點擊的按鈕時,很多人會這么寫:
public class ExampleActivity extends Activity implements OnClickListener {
@Override
public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_example);
findViewById(R.id.first_button).setOnClickListener(this);
findViewById(R.id.second_button).setOnClickListener(this);
}
@Override
public void onClick(final View v) {
switch (v.getId()) {
case R.id.first_button:
// bla bla bla
break;
case R.id.second_button:
// bra bra bra
}
}
}
事實上,Android 官方有些 sample 里面也是這么寫的。然而在我看來,這么寫代碼是非常不優雅的,因為一個 OnClickListener 的實現,只應該關注和點擊事件本身相關的內容,它的含義和 Activity 的含義是截然無關的,讓同一個類繼承/實現他們,會使得這個類的含義變得不清晰。同時,這樣還給 ExampleActivity 類增加了一個 public 的方法,削弱了這個類的封閉性。
所以如果像下面這樣,會好不少:
public class ExampleActivity extends Activity {
private OnClickListener onClickListener = new OnClickListener() {
@Override
public void onClick(final View v) {
switch (v.getId()) {
case R.id.first_button:
// bla bla bla
break;
case R.id.second_button:
// bra bra bra
}
}
};
@Override
public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_example);
findViewById(R.id.first_button).setOnClickListener(onClickListener);
findViewById(R.id.second_button).setOnClickListener(onClickListener);
}
}
這樣寫體現了 composition over inheritance 的思想。它避免了上面的所有問題,看起來舒服得多。
不過,這樣還是讓閱讀代碼時很不方便——看到 onCreate 里面時,還不得不經常滾動到聲明 onClickListener 的地方去,并且在 onClick 中艱難的尋找真正和某個特定按鈕相關的代碼。當然這兩個問題之前那個版本也都無法避免。
另一件糟糕的事情是,不同按鈕的 listener 邏輯很可能是相對獨立的,放到同一個 onClickListener 里,還是很丑陋。
所以為了進一步避免這幾個問題,我一向都是用下面這樣的寫法:
public class ExampleActivity extends Activity {
@Override
public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_example);
findViewById(R.id.first_button).setOnClickListener(new OnClickListener() {
@Override
public void onClick(final View v) {
// bla bla bla
}
});
findViewById(R.id.second_button).setOnClickListener(new OnClickListener() {
@Override
public void onClick(final View v) {
// bra bra bra
}
});
}
}
這樣的話,不同邏輯間相對獨立,看起來非常舒服,便于閱讀,并且讓我找回了寫 JavaScript 的舒暢感覺(劃掉)。
那么問題來了:為什么有的人不使用最后一種寫法呢,倒反是使用第一種寫法呢?
總結
以上是生活随笔為你收集整理的java 无类名实现接口_为什么很多人写 Java/Android 时,选择让同一个类实现多个接口,而不是用多个内部匿名类?...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 构造方法和析构方法_PHP面向
- 下一篇: Rivian 将投资 50 亿美元在佐治