java 无类名实现接口_为什么很多人写 Java/Android 时,选择让同一个类实现多个接口,而不是用多个内部匿名类?...
呃…… 標(biāo)題不太好。讓我在問題描述里解釋一下。
讓我以 Android 開發(fā)中一個(gè)簡(jiǎn)單的例子說明:在一個(gè) Activity 中有多個(gè)可點(diǎn)擊的按鈕時(shí),很多人會(huì)這么寫:
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
}
}
}
事實(shí)上,Android 官方有些 sample 里面也是這么寫的。然而在我看來,這么寫代碼是非常不優(yōu)雅的,因?yàn)橐粋€(gè) OnClickListener 的實(shí)現(xiàn),只應(yīng)該關(guān)注和點(diǎn)擊事件本身相關(guān)的內(nèi)容,它的含義和 Activity 的含義是截然無關(guān)的,讓同一個(gè)類繼承/實(shí)現(xiàn)他們,會(huì)使得這個(gè)類的含義變得不清晰。同時(shí),這樣還給 ExampleActivity 類增加了一個(gè) public 的方法,削弱了這個(gè)類的封閉性。
所以如果像下面這樣,會(huì)好不少:
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);
}
}
這樣寫體現(xiàn)了 composition over inheritance 的思想。它避免了上面的所有問題,看起來舒服得多。
不過,這樣還是讓閱讀代碼時(shí)很不方便——看到 onCreate 里面時(shí),還不得不經(jīng)常滾動(dòng)到聲明 onClickListener 的地方去,并且在 onClick 中艱難的尋找真正和某個(gè)特定按鈕相關(guān)的代碼。當(dāng)然這兩個(gè)問題之前那個(gè)版本也都無法避免。
另一件糟糕的事情是,不同按鈕的 listener 邏輯很可能是相對(duì)獨(dú)立的,放到同一個(gè) onClickListener 里,還是很丑陋。
所以為了進(jìn)一步避免這幾個(gè)問題,我一向都是用下面這樣的寫法:
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
}
});
}
}
這樣的話,不同邏輯間相對(duì)獨(dú)立,看起來非常舒服,便于閱讀,并且讓我找回了寫 JavaScript 的舒暢感覺(劃掉)。
那么問題來了:為什么有的人不使用最后一種寫法呢,倒反是使用第一種寫法呢?
總結(jié)
以上是生活随笔為你收集整理的java 无类名实现接口_为什么很多人写 Java/Android 时,选择让同一个类实现多个接口,而不是用多个内部匿名类?...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 构造方法和析构方法_PHP面向
- 下一篇: android 3d渲染动画效果吗,An