了解如何在Java应用程序中选择正确的方法参数类型并获得更健壮和更短的代码。

我们Java开发人员通常有一个使用方法参数的坏习惯,即不考虑实际需要什么,而只是选择我们习惯的,可用的或首先想到的东西。 考虑以下代表性示例:

private static String poem(Map<Integer, String> numberToWord) {return new StringBuilder().append("There can be only ").append(numberToWord.get(1)).append(" of you.\n").append("Harts are better of when there are ").append(numberToWord.get(2)).append(" of them together.\n").append("These ").append(numberToWord.get(3)).append(" red roses are a symbol of my love to you.\n").toString();}

使用上面的方法时,我们提供了一个将数字转换为字符串的Map。 例如,我们可能提供以下地图:

Map<Integer, String> englishMap = new HashMap<>();englishMap.put(1, "one");englishMap.put(2, "two");englishMap.put(3, "three");

当我们用englishMap调用我们的诗歌方法时,该方法将产生以下输出:

There can be only one of you.
Harts are better of when there are two of them together.
These three red roses are a symbol of my love to you.

听起来不错。 现在,假设您的重要人物是计算机迷,并且想为自己的诗增添趣味并给人留下深刻的印象,那么这就是要走的路:

Map<Integer, String> nerdMap = new HashMap<>();nerdMap.put(1, "1");nerdMap.put(2, "10");nerdMap.put(3, "11");

如果现在将nerdMap提交给poem方法,它将产生以下诗:

There can be only 1 of you.
Harts are better of when there are 10 of them together.
These 11 red roses are a symbol of my love to you.

与所有诗歌一样,很难判断哪首诗比另一首更浪漫,但我当然有自己的看法。

问题所在

上面的解决方案有几个问题:

首先,作为外部呼叫者,我们不能确定poem方法不会更改我们提供的Map。 毕竟,我们提供了一张地图,没有什么阻止接收者对地图做任何可能的事情,甚至完全清除整个地图。 当然可以通过使用Collections.unmodifiableMap()方法包装Map或提供现有地图的副本来避免此副本,从而避免该副本。

其次,当我们只需要将整数转换为String的内容时,我们就不得不使用Map。 在某些情况下,这可能会创建不必要的代码。 回想我们的nerdMap,可以使用Integer :: toBinaryString轻松计算地图中的值,而无需手动映射它们。

解决方案

我们应该努力准确地提供在任何给定情况下所需的内容,而不是更多。 在我们的示例中,我们应该修改poem方法以采用从整数到字符串的函数。 在调用方上如何实现此功能的重要性较低,它可以是映射或函数,也可以是代码或其他东西。 首先,这是应该如何做:

private static String poem(IntFunction<String> numberToWord) {return new StringBuilder().append("There can be only ").append(numberToWord.apply(1)).append(" of you.\n").append("Harts are better of when there are ").append(numberToWord.apply(2)).append(" of them together.\n").append("These ").append(numberToWord.apply(3)).append(" red roses are a symbol of my love to you.\n").toString();}

如果我们想将poem方法与Map一起使用,则可以这样简单地调用它:

// Expose only the Map::get methodSystem.out.println(poem(englishMap::get));

如果我们想像书呆子诗一样计算值,那么我们可以做得更简单:

System.out.println(poem(Integer::toBinaryString));

哎呀,我们甚至可以为另一种患有双重人格障碍的人写一首诗:

System.out.println(poem(no -> englishMap.getOrDefault(no + 1, Integer.toString(no + 1))));

这将产生以下诗歌:

There can be only two of you.
Harts are better of when there are three of them together.
These 4 red roses are a symbol of my love to you.

注意您的方法参数!

翻译自: https://www.javacodegeeks.com/2017/06/use-precise-java-method-parameters.html

使用精确的Java方法参数相关推荐

  1. java.函数参数太多,Java方法参数太多怎么办—Part 2—引入参数对象,javapart

    Java方法参数太多怎么办-Part 2-引入参数对象,javapart 目录 自定义类型 引入参数对象 本文是这个系列的第二篇文章,介绍了通过引入参数对象应对参数过多的问题.如果你也希望参与类似的系 ...

  2. java方法参数类型不确定_一个Java方法能有多少个参数类型?这个好奇coder做了个实验...

    选自 justinblank 机器之心编译 参与:李志伟.张倩 在 JVM 中,一个 Java 方法,最多能定义多少参数呢?这是一个很无聊的问题,即使能定义一万个,十万个,谁又会真的去这么做呢.但是作 ...

  3. java值传递和引用传递_辨析Java方法参数中的值传递和引用传递

    小方法大门道 小瓜瓜作为一个Java初学者,今天跟我说她想通过一个Java方法,将外部变量通过参数传递到方法中去,进行逻辑处理,方法执行完毕之后,再对修改过的变量进行判断处理,代码如下所示. publ ...

  4. java 方法参数多_java 方法参数过多,怎么处理?

    本人对java的研究甚少,之前只是用一用,从未有过深度的学习,但却意外的发现了一个问题,那就是java的参数过多会出现错误,你们可能会认为,我找到的这个问题没有任何意义,对,我也是这样想的,可是,你们 ...

  5. java方法参数Bundle,Java ResourceBundle keySet()方法及示例

    ResourceBundle类keySet()方法keySet()方法在java.util包中可用. keySet()方法用于从此ResourceBundle及其超级捆绑包中获取所有现有键,以在Set ...

  6. java 方法参数绑定_java在注解中绑定方法参数的解决方案

    我们有这样子的需求,需要记录用户操作某个方法的信息并记录到日志里面,例如,用户在保存和更新任务的时候,我们需要记录下用户的ip,具体是保存还是更新,调用的是哪个方法,保存和更新的任务名称以及操作是否成 ...

  7. java 方法 参数 引用_Java 基础

    本质上,只有值传递这一种传递方式,所谓的引用传递是值传递的一种.即:1 2 3 4 5 6// 将2这个值复制一份传递给m int a = 2; m(a); // 将引用o复制一份并将其值传递给m m ...

  8. java方法参数泛型_Java泛型方法类型参数

    我对泛型方法的显式类型参数有问题.我知道我可以这样做: Foo.function(); 假设有一个 void function() {...} 在Foo类中的函数.确切的问题是: >我想下载一些 ...

  9. java方法的参数_Java方法参数

    Java方法参数 在程序设计语言中如何将参数传给方法(或函数): 按值调用:方法接受的是调用者提供的值 按引用调用:方法接受的是调用者提供的地址 Java程序设计语言总是采用按值调用(方法得到的是所有 ...

最新文章

  1. ASP.NET中DataGrid鼠标经过感知以及点击行弹出窗口
  2. 视频数据处理方法!关于开源软件FFmpeg视频抽帧的学习
  3. Spring-JDBC表情符号不能存入数据库
  4. 435. 无重叠区间(贪心算法)
  5. 软件工程概论 课堂练习【空调维修系统 类图】
  6. CodeDay#8:支付宝都在用的容器技术了解一下
  7. gdal for java_gdal java环境配置
  8. WPF MVVM 验证
  9. 【最短路问题】leetcode743. 网络延迟时间
  10. 怎样锁定计算机桌面图标,win10系统锁定桌面图标的详细技巧
  11. postgresql触发器实例
  12. Java使用JNA调用SWMM模型的DLL
  13. c++ int转char*
  14. 偶数提取(不用二次倒位,直接一步到位)
  15. Python输出emoji表情包
  16. 一个功能超全的「登录认证」神器!
  17. python特征选择relieff图像特征优选_python 3.x实现特征选择ReliefF算法
  18. C++异常机制的实现方式和开销分析(作者:白杨)
  19. python:查找兄弟单词
  20. html 圣杯布局 高度,三种实现圣杯布局方法

热门文章

  1. Oracle入门(十四A)之PL/SQL 基本结构
  2. Spring Boot功能实战
  3. subList?? subString???
  4. jQuery 操作元素
  5. 教你一招快速打开idea的秘诀
  6. 2016蓝桥杯省赛---java---A---10(压缩转换)
  7. python定义函数prime判断是否是素数_用自定义函数判断素数 用C语言编写自定义函数prime(int x),判断x是否为素数?...
  8. Makefile浅尝
  9. 从零开始学spring-boot(2)-集成spring-data-jpa
  10. sql server数据库:创建数据库、建立数据库用户、为用户赋予权限