专栏首页Phoenix的Android之旅重构 - 你为什么要对参数赋值?

重构 - 你为什么要对参数赋值?

对于学过多门语言的开发者来说,应该都明白在不同语言中对参数赋值有着不同的意义, 总的来说参数有值传递和引用传递两种, 而在Java中只有值传递的概念。

这意味着在方法内对参数赋值是没有意义的。 而且还很容易引起代码的误解。

对于初学者来说这一点比较重要,可能不是很容易理解,我们用例子来说明。

修改参数

我们来看个简单的例子,在这个例子里面我们在方法内对参数进行了修改,

public class ParamDemo{
  public static void main(String[] args) {
    int x = 5;
    modifyParam(x);
    System.out.println("x : " + x);
  }

  private static void modifyParam(int x) {
    x += 5;
    System.out.println("x : " + x);
  }
}

这段代码的输出还不至于让人糊涂,

x : 10 x : 5

但如果修改的是对象的话,代码可能就有误导性了

修改参数对象

为了说明这个问题,我写了一个demo代码,当然代码是完全跑不通的。。只是为了让代码更容易理解,所以才这么写,

public class ParamDemo{
  public static void main(String[] args) {
    Data date = new Date("4月1号 2018")
    modifyParam(date);
    System.out.println("date : " + date);
    resetParam(date);
    System.out.println("date : " + date);
  }

  private static void modifyParam(Date date) {
    date = date + new Date("1天");
    System.out.println("date : " + date);
  }

  private static void resetParam(Date date) {
    date = new Date("5月2号 2018");
    System.out.println("date : " + date);
  }
}

这段代码理解上来就是,实例化了一个日期对象是4月1日,然后在方法内对日期加了一天, 然后再对这个日期(应该变成了4月2日)换车一个5月2日的对象, 这时候就可以验证对参数赋值和对参数修改的区别所在。 如果这代码运行正常的话,输出应该是下面这样

date : 4月2号 date : 4月2号 date : 5月2号 date : 4月2号

你看,在方法内对参数赋值是没有意义的,因为Java它传递的是值,而不是引用,所以并不能够修改原引用的数值。 这对于从 C 这种可以传引用的语言转过来的开发者来说其实有点别扭, 当然他们也可能会被这种代码误导。

总结

Java是一门传值语言,在coding中其实应该尽量避免对参数赋值的行为, 如果你看到代码中有这样的代码, 请尽情重构了它吧!

本文分享自微信公众号 - Android每日一讲(gh_f053f29083b9),作者:PhoenixZheng

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-06-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java IO的flush

    Java的IO是一个大知识点, 如果把它的知识点拆开来说的话估计能说一个星期,关于IO的体系可以看看下面这张图, (图片是网上找的,侵删)

    PhoenixZheng
  • SharedPreference 的commit和apply

    SharedPreference是Android开发中经常用到的一个数据持久化类, 我们可以把一些需要持久化的数据放到一个指定的 Preference文件中,并...

    PhoenixZheng
  • Gradle 5.0 新特性介绍

    本文翻译自官网 :https://gradle.org/whats-new/gradle-5/

    PhoenixZheng
  • 快速生成日期维度数据

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.n...

    用户1148526
  • 毫秒级时间戳转换封装

    const dateFormat = (time) => { var date = new Date() date.setTime(time) var t...

    余生
  • Linux 常用系统工作命令-date

    突发一个兴趣,整理 Linux 常用命令。每天记忆一两个就好,详情查看 知识星球 https://t.zsxq.com/Mja2Fe2

    hedeqiang
  • Python——量化分析常用命令介绍(五)

    Last login: Sun Jul 14 08:52:32 on ttys000

    Ed_Frey
  • shell语言关于date的一些用法

    今天没干什么正事儿,都开了会了,写点儿关于shell脚本语言的知识吧,这个也是前两天完成一个业务方的需求的时候使用到的方法,分享出来,希望对大家有点用吧...

    AsiaYe
  • 关于评审开发人员的sql语句(r3笔记第11天)

    在平时的工作中,经常会有一些开发人员提出一些数据库相关的一些问题。可能问的最多的就是sql语句了。 按照一个标准的流程,开发提交的sql语句在完成一系列测试之后...

    jeanron100
  • Python——量化分析介绍(八)

    今天内容不多,也不复杂。首先,之前写的stock_util补充一个获取指定日期前某个交易日期的函数,毕竟后期写到买卖点指标的时候,难免要用到前后两个交易日指标值...

    Ed_Frey

扫码关注云+社区

领取腾讯云代金券