使用 ButterKnife 公开成员变量

Exposing Member Variables with ButterKnife

奇怪的问题,我正在使用 ButterKnife,我刚刚发现您不能在私有方法中使用,因为 ButterKnife 创建 类 使用它们。 这不违反封装原则吗?我的意思是,那你的变量也会暴露给其他类,不是吗?

你完全正确,使用Butterknife违反了封装原则。


Butterknife 使用自己生成的代码来执行视图查找。这些查找是在单独的 class(-es) 中完成的,因此这些字段不能是私有的。

引用:

The generated code exists in a class outside of this class, thus the fields are truly being accessed outside of the class, hence not private. If you see other generated code that is accessing private fields, it is using reflection to by-pass the private access restriction, which means you have fields that look private but are actually being accessed outside of the class.

使用反射不仅在幕后是一回事,而且与视图查找相比速度要慢得多。


无论如何,那些使用 Butterknife 执行视图绑定的 classes 不应该在负责相同事情(即视图绑定)的 classes 之外的任何地方初始化,因此违反封装不是什么大问题交易。例如:Activities 可以有 Fragments 的实例,Fragments/Activities 可以有 RecyclerViewAdapters 的实例,因为所有这些都负责视图绑定,但是 ViewModel (MVVM 架构) 例如一般不应有 Fragment/Activity 或任何 View 的实例,因为它与视图绑定无关。


祝你好运。 :)