关于android:SetterGetter之争有点意思

这几天在做 Code Review 的时候,发现 Model 层内大量 Bean 写法不一。

有些类是属性凋谢一路 public,有些类则属性全副关闭 private

大家针对这个问题探讨得还挺冲动,着实出其不意。

听他们的说辞,观点都挺有情理的。

关闭派支持者持以下观点。

Java 官网举荐针对实体类 Bean 进行封装,确保对外层调用者暗藏敏感数据。应该将类变量或属性申明为公有并提供公共获取及设置的办法,以便拜访和更新公有变量的值。

确实。假使一个属性是以 obj.field 的形式拜访或间接赋值更新,当 field 的拜访及更新逻辑须要调整时则得从新编写办法反对。

举个????。

一个蕴含间接拜访及更新变量的类如下。

Class Obj{
  public int value;
}

Obj obj = new Obj();

//应用属性间接拜访或更新
obj.value = -1;
int objValue = object.value;

而采纳关闭凋谢准则编写的类为:

Class Obj{
  private int value;
  
  public void setValue(int value){
    this.value = value;
  }
  
  public int getValue(){
    return value;
  }
}

Obj obj = new Obj();

//应用办法调用的形式拜访或更新
obj.setValue(-1);
int objValue = object.getValue();

Obj 心愿限定 value 的值在大于等于 0 的值区间时需调整 Obj 类的实现。

Class Obj{
  private int value;
  
  //限定逻辑
  public void setValue(int value){
    if(value < 0){
      value = 0;
    }
    this.value = value;
  }
  
  public int getValue(){
    return this.value;
  }
}

这样看起来,关闭派的写法确有前瞻性的。在将来,无论属性的拜访及更新值逻辑要做怎么的调整,对于内部调用者而言是齐全通明的。

凋谢派支持者其实并不拥护关闭派的说辞,但针对关闭派所有 Bean 实体都写成这种格局,且看提交记录这些类大部分都曾经两三年未修改的现状颇为不满。

有些用于形容 Android 设施信息,网络信息,App信息等固定内容的类,其属性并不会轻易进行批改。

想想也是,如AppInfo类用于形容 App 信息。

public class AppInfo{
  public String appId;
  public String versionName;
  public String verionCode;
  public String platform;
  public String channel;
  public String osVersion;
  public String sdkVersion;
  public String deviceId;
  public String packageName;
}

在没有 JIT 场景下,间接字段拜访要比调用 getter 办法快大概 3 倍;在有 JIT 场景下,间接字段拜访要比办法调用快大概 7 倍。

当然。凋谢派支持者也会思考该类的设计是否正当。

如上述变量 appId,心愿在测试环境下追加一个 test 的后缀标识。

比方正式环境下 appId 值为 com.android.demo,测试环境则为 com.android.demo.test

可调整为:

public class AppInfo{

  public String appId;
  
  //新增办法用于返回兼容后的 appId
  public String getCompatAppId(){
    if(BuildConfig.TEST){
       return appId + ".test";
    }
    return appId;
  }
}

又或者调整为:

public class AppInfoUtils{

   //应用工具类对 appId 做二次转化
   public getCompatAppId(String appId){
      if(BuildConfig.TEST){
         return appId + ".test";
      }
      return appId;
   }
}

这两种办法都可。

凋谢派认为

  1. appId 属性不应该被轻易改变,没有必要过渡设计;
  2. 哪怕真的须要改变,改变也没有毁坏属性的定义,可通过新增性能函数来解决这个问题即可。

一百个编程者心里有一百个哈姆雷特啊!

聊一聊我的认识。

在理论我的项目我的确也不会为所有 Bean 类编写 setter/getter 办法,因为会让代码变得冗余且调用绝对麻烦。

但在封装设计SDK上,思考到 SDK 保护及 API 更改的老本,还是遵循了凋谢关闭的设计准则,审慎为好。

但代码看起来就是顺当呀。

好在Koltin解决了我心田的纠结。

对于 var 关键字申明的属性,gettter/setter是可选的,得益于幕后字段的设计,属性的拜访及更新变为可干涉的。

最初分享下最近有感的一句话

Fucking code, just happy!

欢送关注 「Android之禅」公众号,和你分享有价值有思考的技术文章。
可增加微信 「Ming_Lyan」备注 “进群” 退出技术交换群,探讨技术问题严禁所有广告灌水。
如有 Android 畛域有遇到技术难题亦或对将来职业规划有纳闷,一起探讨交换。
欢送来扰。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理