2014-12-02 28 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