当前位置: 首页 > news >正文

Effective Java 学习笔记 方法签名设计

目录

谨慎选择方法名称

不要过于追求提供便利的快捷方法

避免过长的参数列表

对于参数类型优先使用接口而不是类

对于boolean参数,要优先使用两个元素的枚举类型


本文接续前一篇文章聚焦Java方法签名的设计,方法签名包括了方法的输入和输出参数以及方法名称,在第51条作者总结了5条设计的经验。

谨慎选择方法名称

方法名称的设置有几个原则:一是易于理解,二是要符合大众的认可,比如get和set,比如驼峰命名法等等。这些细节可以参考Java类库的API。

不要过于追求提供便利的快捷方法

对于类或者接口的每一个动作都要提供功能齐全的方法。只有当某一项操作被经常使用时才考虑把它独立出来提供一个快捷的使用方式,但是这个方式如果只是其他方法经常使用,没有对外使用的场景就请以私有方法的形式定义。总之尽可能将面向客户端的方法设计的简单,易于理解。

避免过长的参数列表

对于客户端来说,超过4个的参数列表就不太容易使用了,尤其是有相同类型的参数,调用者很难记住参数的调用顺序,而且一旦有了错误相同类型的参数是不会直接返回异常的,所以会有非常大的风险。

文中列举了三种可以缩短过长参数列表的方法:

  • 把一个方法分解为多个方法,每一个方法取一部分的参数作为输入。
  • 创建辅助类,用来保存参数的分组。通过辅助类来分担一部分的参数输入
public class OrderManager {public static void main(String[] args) {// 创建一个 CustomerInfo 对象CustomerInfo customerInfo = new CustomerInfo("Alice Smith", "123 Main St", "New York", "NY", "10001");// 创建订单详情String productName = "Widget";double price = 99.99;Date orderDate = new Date();// 处理订单processOrder(customerInfo, productName, price, orderDate);}/*** Processes an order with customer information and order details.* @param customerInfo the customer information* @param productName the name of the product* @param price the price of the product* @param orderDate the date of the order*/public static void processOrder(CustomerInfo customerInfo, String productName, double price, Date orderDate) {// 进行处理订单的逻辑System.out.println("Processing order for " + customerInfo.getName());System.out.println("Product: " + productName);System.out.println("Price: $" + price);System.out.println("Order Date: " + orderDate);}
}class CustomerInfo {private String name;private String address;private String city;private String state;private String zipCode;public CustomerInfo(String name, String address, String city, String state, String zipCode) {this.name = name;this.address = address;this.city = city;this.state = state;this.zipCode = zipCode;}public String getName() {return name;}public String getAddress() {return address;}public String getCity() {return city;}public String getState() {return state;}public String getZipCode() {return zipCode;}
}

这里通过CustomerInfo作为辅助类分担了processOrder的一部分参数。

  • 采用Builder模式,见第2条

对于参数类型优先使用接口而不是类

用类作为参数会限制客户端对于参数类型的选择范围。比如用Map接口作为参数类型就可以允许客户端输入HashMap, TreeMap等实现类。

对于boolean参数,要优先使用两个元素的枚举类型

对于输入为boolean值的方法,输入true或者false不易于阅读和理解,而且一旦未来方法要加入第三种选择,则方法没有任何可扩展性。所以可以通过枚举类型来保留这部分可扩展性,同时还更易于理解:

public enum TemperatureScale{FAHRENHEIT, CELSIUS}Thermometer.newInstance(TemperatureScale.CELSIUM)
//而不是Thermometer.newInstance(true)

http://www.lryc.cn/news/444385.html

相关文章:

  • 毛利超70%、超70+智驾客户,这家AI数据训练服务商刚刚止亏
  • 本地部署高颜值某抑云音乐播放器Splayer并实现无公网IP远程听歌
  • 图像压缩编码(4)--H.26x系列视频压缩编码_2
  • JS渲染锻炼输入表单
  • proteus仿真学习(1)
  • 决策树+随机森林模型实现足球大小球让球预测软件
  • 31省市农业地图大数据
  • http请求包含什么
  • 【基础算法总结】模拟篇
  • 《深度学习》PyTorch 手写数字识别 案例解析及实现 <下>
  • 【笔记】材料分析测试:晶体学
  • 飞塔Fortigate7.4.4的DNS劫持功能
  • Unity 设计模式 之 行为型模式 -【状态模式】【观察者模式】【备忘录模式】
  • 【RabbitMQ】RabbitMQ 的概念以及使用RabbitMQ编写生产者消费者代码
  • openmv与stm32通信
  • C++ STL全面解析:六大核心组件之一----序列式容器(vector和List)(STL进阶学习)
  • 【c数据结构】OJ练习篇 帮你更深层次理解链表!(相交链表、相交链表、环形链表、环形链表之寻找环形入口点、判断链表是否是回文结构、 随机链表的复制)
  • 微软开源GraphRAG的使用教程(最全,非常详细)
  • 使用Refine构建项目(1)初始化项目
  • 【Docker】安装及使用
  • [大语言模型-论文精读] 以《黑神话:悟空》为研究案例探讨VLMs能否玩动作角色扮演游戏?
  • 提升动态数据查询效率:应对数据库成为性能瓶颈的优化方案
  • Prometheus+grafana+kafka_exporter监控kafka运行情况
  • 在vue中:style 的几种使用方式
  • 商城小程序后端开发实践中出现的问题及其解决方法
  • 阿里Arthas-Java诊断工具,基本操作和命令使用
  • Go 1.19.4 路径和目录-Day 15
  • jEasyUI 创建标签页
  • 鸿蒙HarmonyOS开发:一次开发,多端部署(界面级)天气应用案例
  • 使用 Python 模拟光的折射,反射,和全反射