依賴注入框架AndroidAnnotations和ButterKnife真的方便了開發者?

之前未使用過依賴注入框架AndroidAnnotations和ButterKnife。但在各個地方見到過網友推薦使用依賴注入。然而我看了之後覺得除了簡化了findViewById外並沒簡化多少,而且還需給activity加上後綴,改成activity_。總的來說看上去可讀性還不如原生的清晰。

使用前代碼是這樣的:

public void initView() {
btn1 = (RadioButton) findViewById(R.id.mainactivity_btn_btn1);
btn2 = (RadioButton) findViewById(R.id.mainactivity_btn_btn2);

btn1.setOnClickListener(this);
btn2.setOnClickListener(this);

使用後代碼是這樣的:

@EActivity(R.layout.main)
public class MyActivity extends Activity {

@ViewById(R.id.myInput)
EditText myInput;

@ViewById(R.id.myTextView)
TextView textView;

@Click
void myButton() {
String name = myInput.getText().toString();
textView.setText("Hello "+name);
}
}

使用這類框架的開發者能否解答我的疑惑,為何你們會選擇使用?要是我,我情願寫findViewById,只為代碼清晰明了。


更新一下,看到 @wakao 的答案,槽點有些多,吐槽下:

  1. .var .filed 這種寫法不是快捷鍵,這是 Intellij IDEA 的 Postfix Completion Feature,不要混淆了。
  2. Annotation 是 Java 層面的東西啊,怎麼叫不像 Android 代碼了(別忘了 @Override 也是註解),不太懂。
  3. 拿 compile 那點性能損耗上台來講,也是醉了。
  4. 吐槽不能。。

==== 以下為原回答 ====

謝邀。

之前一直是用 JakeWharton/butterknife · GitHub 加上 avast/android-butterknife-zelezny · GitHub,你確定你手寫 findViewById 會比我用 Plugin 一鍵生成代碼更快?:)

使用 ButterKnife,是因為它足夠輕。

Field and method binding for Android views which uses annotation processing to generate boilerplate code for you.

通過註解,把 findViewById 代碼的生成丟給編譯器處理,在不降低執行效率的前提下,提高代碼可讀性和減少代碼量,有什麼理由不用?至於 AndroidAnnotations,沒用過,也不推薦用,太重,看著噁心。


話說我們做程序員的,都應該多少是個懶人,我們總是想辦法驅使我們的電腦幫我們幹活,所以我們學會了各式各樣的語言來告訴電腦該做什麼——儘管,他們有時候也會誤會我們的意思。

突然有一天,我覺得有些代碼其實,可以按照某種規則生成,但你又不能不寫——不是所有的重複代碼都可以通過重構並採用高端技術比如泛型來消除的——比如我最痛恨的代碼:

TextView textView = (TextView) findViewById(R.id.text_view);
Button button = (Button) findViewById(R.id.button);

這樣的代碼,你總不能不寫吧,真是讓人沮喪。突然想到以前背單詞的故事:正著背背不過 C,倒著背背不過 V。嗯,也許寫 Android app,也是寫不過 findViewById 的吧。。

我們今天要介紹的 ButterKnife 其實就是一個依託 Java 的註解機制來實現輔助代碼生成的框架,讀完本文,你將能夠了解到 Java 的註解處理器的強大之處,你也會對 dagger2 和 androidannotations 這樣類似的框架有一定的認識。

篇幅有限,貼上文章鏈接:

【騰訊Bugly乾貨分享】深入理解 ButterKnife,讓你的程序學會寫代碼 - 遇見 - 知乎專欄


用一下,然後你就離不開了。

題主的例子,其實玩了點遊戲。

比如btn的定義沒有,click具體處理代碼的地方,也沒有。

在我看來,優點不是少寫幾行代碼,而是閱讀起來更爽。

傳統的寫法,一個控制項相關可能要拆成四部分。

1,Button btn;

2,btn = (Button) findViewById(R.id.btn);

3,btn.setOnClickListener(this);

4,

@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn:
break;
}
}

如果有多個控制項,onClick中簡直不能見人,又要再拆分方法。一個控制項,竟然要寫到5處地方,看著都累。

但是實際上我們要關心什麼?無非就是2點,

綁定告訴我們是xml中的哪個控制項,

點擊事件告訴我們它要幹嘛。

既然這樣,ButterKnife之類的就只用寫兩個地方。

1,2結合,3,4結合。代碼結構清爽多了。


anko只能呵呵

關於Kotlin android extension插件:

代碼裡面直接拿ID當成view變數用,連定義和初始化都省了,這已經超越了解決懶的問題了,這樣的代碼是很美的。


目前在項目中嘗試使用databinding,比註解框架好點,就是有時候studio編譯不正常


AndroidAnnotations太重不好用,大家都知道。你為什麼要連著ButterKnife一起黑?Butterknife的主要目的不是少寫多少代碼,而是為了精簡代碼。findviewbyid這些東西,就不應該顯示出來,這樣程序員才能更專註於核心代碼。


做開發最不喜歡的就是不停的寫重複代碼。如果你一個界面控制項巨多無比, 這種findviewbyid的代碼要寫成一大陀,像屎一樣。樓主給你推薦butterknief和androidstudio上面的一個插件配合使用,叫ButterKnief Zelezny。這樣你什麼都不用寫,會自動幫你用butterknief生成所有的控制項初始化代碼。具體使用你可以去自己查資料,往往一些方便會極大提高你的開發效率。

舉個列子,一個項目裡面,有一個界面有15個控制項需要初始化。如果用我說的,滑鼠點兩下就解決了,你還會去用代碼去寫這種毫無意義浪費時間的代碼嘛?


我個人看法完全沒有必要。

鑒於有人 @nekocode 吐槽我,我回答下下。

#####對@nekocode吐槽我的反駁####

一條條來。。。。

1.OK,不叫快捷鍵,叫postfix Code completion。其實,alt+enter completion也可以不是快捷鍵的?該改什麼名字好。只看結果,一樣無疑。

2.並沒有說annotation不是Android代碼好吧,表達的意思是,findViewById更直觀,一看就是android代碼的「樣子」,而且用的是「像」這個字眼,沒加雙引號而已啦,別糾結。

3.我都說了可以忽略不計的啦。

4.滑稽?沒說annotation會增加方法數啊,說的是引入這些庫會增加而已,Butterknife.bind()不是方法?而且放在第四點,是因為並不那麼重要了,用也可,不用也罷。

不要糾結於annotation,而是說用這些庫本身。

~~~~~~~下面是原始回復~~~~~~

1.基於寫代碼效率,不見得快,能比findViewByid快多少呢?用intellij或者studio,把快捷鍵,例如.var,.filed這些用熟練,寫代碼一樣溜的很;

2.從代碼可讀性上,實在覺得,用annotation的話,不禁會問,這還像Android代碼嗎?把不該隱藏的細節都隱藏了,這真的好么?而且自己寫,清晰不少啊,對新人來說,可接受成都也高,看源代碼也方便。

3.怎麼會沒性能問題呢,不是runtime的性能,就是compile的性能,畢竟繞了一下,當然compile的可以認為忽略不計,何必?

4.包更大了,方法數更多了啊


Butterknife其實在編譯階段要耗時些,在運行階段沒有任何影響。樓主擔心性能的話就用LayoutCreator框架吧,一鍵幫你生成findViewById和onClick,EditText幫你判空等等,用了就知道方便了。


只用來代替findviewbyid用ButterKnife 比較輕 ,但是代替findviewbyid的方法不只用注入框架 插件+快捷鍵就可以很好的實現 像注入框架這種入侵性還挺大的框架 少用為好 而AndroidAnnotations功能較多 可以用在很多場合 但是功能再多 也不如直接寫代碼多 在正式項目中 與到的情況有時annotations應付不來的 又要寫其他風格的代碼 引其他框架 這樣風格就不統一了 而且加上其可讀性下降 調試不便 帶來維護性下降 都是得不償失的 但是因為其實話快速開發 可以用它些Demo 做測試等


我們公司前段時間開發一個新app,計劃用AndroidAnnotation,在我強烈建議(詆毀註解式框架)下,成功沒用。。我覺得特別難受啊在activity後面加個_,渾身上下都不自在debug都難受。。


databinding一出,誰與爭鋒


Androidannotations可以不用,butterknife真是神器啊,因為是編譯時動態生成代碼,根本沒有性能損耗。可讀性絕對上了好幾個檔次,還有插件一鍵生成@bind代碼,幾乎不用手寫。還有一點,題主對依賴注入的理解還是有偏差的,你看看butterknife6 叫@inject ,7改叫@bind就知道了。


ButterKnife比較方便,而且有專門的android studio的插件來自動生成代碼,看起來也比較整潔,除了會增加代碼體積,沒有其他壞處吧,我感覺挺好的,但是項目如果較小的話,還是老老實實用findview吧


ButterKnife確實可以簡化不少代碼,對性能沒影響,不過如果UI部件不多的話用不用都沒關係,副作用就是會有很多註解,這個看個人喜好了。AndroidAnnotations因為太重沒有用過,不做評價。


你的對比方式有問題呀,第一種方式沒有寫出控制項聲明的代碼,也沒有寫出OnClickListener的方法,看起來好像代碼量差不多,其實代碼量還是簡化了許多的。

其實方便不方便還是看個人使用習慣,不習慣的,代碼怎麼簡潔都不方便。

但是對方法使用依賴注入我是不太贊成的,對其他接手你代碼的不習慣這套依賴注入框架的人來說可讀性大大降低。


分頁阅读: 1 2