2014-12-02 26 views
23

我偶然發現了一個非常有趣的依賴注入庫,名爲。使用很容易將視圖注入到活動或片段中。Butterknife查看注射

class ExampleActivity extends Activity { 
    @InjectView(R.id.title) TextView title; 
    @InjectView(R.id.subtitle) TextView subtitle; 
    @InjectView(R.id.footer) TextView footer; 

    @Override public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.simple_activity); 
    ButterKnife.inject(this); 
    // TODO Use "injected" views... 
    } 
} 

但是,如果使用依賴注入這些觀點必須public使Butterknife可以把它注射(使用private領域導致異常fields must not be private or static)。

在我過去的項目中,我總是把所有的成員字段(包括視圖)private作爲我認爲這是最佳實踐(信息隱藏等)現在我想知道是否有一個原因,爲什麼不應該使所有views public?在這種情況下,我不能使用,但我想使用它,因爲它可以簡化代碼。

+0

Guice幾乎沒有更好地做同樣的事情,但沒有搞砸你的代碼? – 2014-12-02 08:24:31

+0

你爲什麼認爲它搞亂了代碼? – Moonlit 2014-12-02 09:04:12

+0

@G_V:也許,但谷歌說不要使用它。請參閱http://stackoverflow.com/questions/24194283/does-avoid-dependency-injection-frameworks-in-the-android-memory-guide-apply-t和http://stackoverflow.com/questions/5067681/guice - 性能上,機器人。 – 2015-07-30 11:25:53

回答

44

首先,黃油刀不是依賴注入庫。您可以將其視爲樣板縮減庫,因爲它可以替代findViewById和各種setXxxListener調用。

Butter Knife要求視圖不是私有的原因是它實際上會生成設置字段的代碼。它生成的代碼與您的類一樣存在於相同的包中,這就是爲什麼該字段必須是包私有的,受保護的或公共的。如果該字段是私人的,則生成的代碼將無法編譯,因爲它無法訪問專用字段。

生成的代碼看起來是這樣的:

public static void inject(ExampleActivity target, ExampleActivity source) { 
    target.title = (TextView) source.findViewById(R.id.title); 
    target.subtitle = (TextView) source.findViewById(R.id.subtitle); 
    target.footer = (TextView) source.findViewById(R.id.footer); 
} 

當你調用ButterKnife.inject(this)它看起來了這個生成類,並與您的ExampleActivity作爲目的的領域和來源,例如呼叫inject方法findViewById來電。

+1

謝謝你的澄清。所以,你認爲宣佈領域包私人甚至公開是不被認爲是不好的做法?我只是想知道,因爲我總是宣佈我的領域是私人的,我感覺有點不對勁。但與此同時,我認爲它沒有太大的區別......對吧? – Moonlit 2014-12-02 08:50:13

+8

我認爲package-private在範圍上是非常有限的,這不是什麼大不了的事情。如果你不能信任你的包中的其他類,那麼你還有其他問題:)另外package-private也用於暴露測試類,因此很常見。雖然我不會公開,但您仍然想隱藏這些字段作爲實現細節。 – 2014-12-02 08:51:56

+2

它通過暴露不應該被觸及的東西來使代碼更難以閱讀和維護。您應該始終致力於編寫代碼,讓其他人無需花費數小時即可弄清楚發生了什麼。這對於那些不需要在他們的getter或setter之外的地方訪問的變量是沒有用的,因爲這些變量有檢查和其他控制。 – 2014-12-02 09:14:10