欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android开发中JavaBean不推荐写get/set方法原因

程序员文章站 2022-08-13 21:22:59
Android使用get/set方法会降低性能,因为内存是有限的,随着应用复杂度增加,后期的应用更倾向于模块化、插件化来尽量减少主程序的容量,一般会采用如下几种方式做优化: 使用...

Android使用get/set方法会降低性能,因为内存是有限的,随着应用复杂度增加,后期的应用更倾向于模块化、插件化来尽量减少主程序的容量,一般会采用如下几种方式做优化:

使用so来封装共同模块,通过加载库的形式实现代码共享

使用jar形式跟so一样,不过容易被反编译

简化代码编写可以使用反射机制和注解来实现

插件,使用sharedUserId来实现共享进程的方式

这里面提到反射,如果属性是私有的,我们需要反射它们的get方法,把原来对象的属性复制给新的对象中,这跟直接反射拿到public属性比较,显然执行效率降低了很多。

另外,我们阅读Google的源代码,都是实体类属性被定义成public的。

再者,Android对其他框架依赖很小,不遵循JavaBean规范,不像JavaEE开发那样,造成灾难性后果。不得不提,JavaBean规范是契合OO封装概念的,好处也有,例如钩子方法,计算属性,设计模式的扩展,程序易于修改、维护,架构解耦,尤其是向后兼容性,对Web端开发,是必须要遵循的。

当然,对于早期的Android开发来说,重视性能而忽视不遵守JavaBean规范带来的危害性,说得过去。随着生态系统和业务的庞杂,向后兼容性不得不纳入考虑,这时候,Android是不是该拾起那些冗余的get/set方法呢?

不用担心,现在是2014年,C#、Scala等比Java新的面向对象语言自身就提供了语言特性来实现这些常用需求,所以根本不需要Java Bean这样繁琐的约定。C#且不说没有用于Android开发,向后兼容也只能做到源代码级别,微软还是不推荐使用公有字段的。Scala的var或val改为final def的话,无论源代码级的向后兼容性,还是二进制级的向后兼容性,都不遭受破坏。

这种属性定义的方式,已经被很多新型面向对象语言所采纳,例如Dart和Kotlin。恰巧,谷歌已经把Kotlin作为Android开发的官方语言了,而Dart作为Flutter开发框架的编程语言,就更不言而喻了。

这里扯远了。总之,要我在实体类写get/set,要么用DataBinding的ObservableField,要么速速向Kotlin甚至Flutter转型。当然,Java也需要更深层次研究,不能只停留在新语言的语法糖上面而忽视了本质的东西。