java变量的声明与赋值分离规范示例

 更新时间:2023年09月21日 14:46:02   作者:GuangHui  
这篇文章主要为大家介绍了java变量的声明与赋值分离规范示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

自检:

变量声明之后是否有立即赋值,集合声明之后是否有立即添加元素

存在的问题:

变量的声明和赋值分离带来的问题就是,把赋值的过程与业务处理混杂在一起。

编程规则:

变量要一次性完成初始化

应对策略:

  • 1.在声明前面加上final,用不变性的限制约束代码。
  • 2.用声明式的方式进行集合的初始化。
    • 传统的集合初始化方式是命令式的,而我们要做的就是用声明式的方式进行集合的初始化,让初始化的过程一次性完成。再进一步,以声明式的标准来看代码,会帮助我们发现许多的。

1. 变量的初始化

EpubStatus status = null;
CreateEpubResponse response = createEpub(request);
if (response.getCode() == 201) {
    status = EpubStatus.CREATED;
} else {
    status = EpubStatus.TO_CREATE;
}

上面的代码,从语义上说,第一行的变量初始化其实是没有用的,这是一次假的初始化。这段代码里的变量赋值是在声明很久之后才完成的,也就是说,变量初始化没有一次性完成。

这种代码真正的问题就是不清晰,变量初始化与业务处理混在在一起。通常来说,这种代码后面紧接着就是一大堆更复杂的业务处理。很多代码难读,一个重要的原因就是把不同层面的代码混在了一起。

这种代码在实际的代码库中出现的频率非常高,只不过,它会以各种变形的方式呈现出来。有的变量甚至是在相隔很远的地方才做了真正的赋值,完成了初始化,这中间已经夹杂了很多的业务代码在其中,进一步增加了理解的复杂度。所以,我们编程时要有一个基本原则:变量一次性完成初始化。

final CreateEpubResponse response = createEpub(request);
final EpubStatus status = toEpubStatus(response);
private EpubStatus toEpubStatus(final CreateEpubResponse response) {
    if (response.getCode() == 201) {
        return EpubStatus.CREATED;
    }
    return EpubStatus.TO_CREATE;
}

在这段改进的代码中,我们提取出了一个函数,将 response 转成对应的内部的 EPUB 状态。

还有一点不知道你注意到了没有,在新的变量声明中,我加上了 final,在 Java 的语义中,一个变量加上了 final,也就意味着这个变量不能再次赋值。尽可能编写不变的代码,尽可能使用不变的量。所以,在能够使用 final 的地方尽量使用 final,限制变量的赋值。

对于 Java 程序员来说,还有一个特殊的场景,就是异常处理的场景,强迫你把变量的声明与初始化分开,就像下面这段代码:

InputStream is = null;
try {
    is = new FileInputStream(...);
    ...
} catch (IOException e) {
    ...
} finally {
    if (is != null) {
        is.close();
    }
}

如果采用 Java 7 之后的版本,采用 try-with-resource 的写法,代码就可以更简洁了:

try (InputStream is = new FileInputStream(...)) {
    ...
}

2. 集合的初始化

List<Permission> permissions = new ArrayList<>();
permissions.add(Permission.BOOK_READ);
permissions.add(Permission.BOOK_WRITE);
check.grantTo(Role.AUTHOR, permissions);

这和我们前面所说的变量先声明后赋值,本质上是一回事,都是从一个变量的声明到初始化成一个可用的状态,中间隔了太远的距离。

我们可以使用 Guava(Google 提供的一个 Java 库)进行修改优化:

List<Permission> permissions = ImmutableList.of(
Permission.BOOK_READ,
Permission.BOOK_WRITE
);
check.grantTo(Role.AUTHOR, permissions);

这段代码里的 List 用的是一个 ImmutableList,也就是一个不可变的 List,也就是说,这个 List 一旦创建好了,就是不能修改了,对应的实现就是各种添加、删除之类的方法全部都禁用了。

针对Map同样有类似的用法:

private static Map<Locale, String> CODE_MAPPING = ImmutableMap.of(
LOCALE.ENGLISH, "EN",
LOCALE.CHINESE, "CH"
);

对比我们改造前后的代码,二者之间还有一个更关键的区别:前面的代码是命令式的代码,而后面的代码是声明式的代码。

命令式的代码,就是告诉你“怎么做”的代码,就像改造前的代码,声明一个集合,然后添加一个元素,再添加一个元素。而声明式的代码,是告诉你“做什么”的代码,改造后就是,我要一个包含了这两个元素的集合。

声明式的代码体现的意图,是更高层面的抽象,把意图和实现分开,从某种意义上来说,也是一种分离关注点。所以,用声明式的标准来看代码,是一个发现代码的重要参考。

以上就是java变量的声明与赋值分离规范示例的详细内容,更多关于java变量的声明与赋值分离的资料请关注脚本之家其它相关文章!

相关文章

  • Maven+oracle+SSM搭建简单项目的方法

    Maven+oracle+SSM搭建简单项目的方法

    本篇文章主要介绍了Maven+oracle+SSM搭建简单项目的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • Spring纯注解配置实现代码示例解析

    Spring纯注解配置实现代码示例解析

    这篇文章主要介绍了Spring纯注解配置实现代码示例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • IntelliJ IDEA配置Tomcat(完整版图文教程)

    IntelliJ IDEA配置Tomcat(完整版图文教程)

    这篇文章主要介绍了IntelliJ IDEA配置Tomcat(完整版图文教程),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • 深入理解Java显式锁的相关知识

    深入理解Java显式锁的相关知识

    今天带大家学习的是关于Java的相关知识,文章围绕着Java显式锁展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • java Unicode和UTF-8之间转换实例

    java Unicode和UTF-8之间转换实例

    这篇文章主要介绍了java Unicode和UTF-8之间转换实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • java中使用Files.readLines()处理文本中行数据方式

    java中使用Files.readLines()处理文本中行数据方式

    这篇文章主要介绍了java中使用Files.readLines()处理文本中行数据方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • Map获取键值,Map的几种遍历方法总结(推荐)

    Map获取键值,Map的几种遍历方法总结(推荐)

    下面小编就为大家带来一篇Map获取键值,Map的几种遍历方法总结(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • SpringMVC @ResponseBody 415错误处理方式

    SpringMVC @ResponseBody 415错误处理方式

    这篇文章主要介绍了SpringMVC @ResponseBody 415错误处理方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • java使用poi生成excel的步骤

    java使用poi生成excel的步骤

    2010以上格式使用XSSFWorkBook对象, 2003格式使用HSSFWorkBook对象, 其他对象操作基本一样,本文重点给大家介绍java使用poi生成excel的相关知识,感兴趣的朋友一起看看吧
    2022-04-04
  • SpringSecurity授权实现基本思路

    SpringSecurity授权实现基本思路

    本文介绍了SpringSecurity中使用FilterSecurityInterceptor进行权限校验的基本方法,通过SecurityContextHolder获取Authentication中的权限信息,感兴趣的朋友跟随小编一起看看吧
    2024-10-10

最新评论