使用 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
的实例,因为它与视图绑定无关。
祝你好运。 :)
奇怪的问题,我正在使用 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
的实例,因为它与视图绑定无关。
祝你好运。 :)