当前位置: 首页 > 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)

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 使用python用递归实现汉诺塔算法
  • 三种springboot启动时加载方式
  • 蓝桥杯【物联网】零基础到国奖之路:十. OLED
  • 花朵识别系统Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练
  • 基于无人机影像的可见光单木分割数据集-json格式
  • [Python]二、Python基础数据科学库(1)
  • 2024最新!!!iOS高级面试题,全!(二)
  • Golang | Leetcode Golang题解之第416题分割等和子集
  • Linux系统(Ubuntu)(下载篇)
  • C++11标准模板(STL)- 常用数学函数 - 计算e的给定幂 (ex)(std::exp, std::expf, std::expl)
  • 【Oracle】ORA-02292: integrity constraint
  • Qt clicked()、clicked(bool)、toggled(bool)信号的区别和联系
  • 基于C语言的基数排序算法
  • 如何安装1Panel面板并架设一个静态网站
  • 【ChatGPT】提示词助力高效文献处理、公文撰写、会议纪要与视频总结
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • 230. Kth Smallest Element in a BST
  • Android Studio:GIT提交项目到远程仓库
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • Js基础知识(四) - js运行原理与机制
  • Odoo domain写法及运用
  • Phpstorm怎样批量删除空行?
  • Sass Day-01
  • Vue组件定义
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 分类模型——Logistics Regression
  • 欢迎参加第二届中国游戏开发者大会
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 如何合理的规划jvm性能调优
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • 正则学习笔记
  • ​【数据结构与算法】冒泡排序:简单易懂的排序算法解析
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • # Panda3d 碰撞检测系统介绍
  • #git 撤消对文件的更改
  • #HarmonyOS:软件安装window和mac预览Hello World
  • (定时器/计数器)中断系统(详解与使用)
  • (附源码)php投票系统 毕业设计 121500
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (论文阅读11/100)Fast R-CNN
  • (七)Flink Watermark
  • (原)Matlab的svmtrain和svmclassify
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (转)视频码率,帧率和分辨率的联系与区别
  • (转)四层和七层负载均衡的区别
  • .FileZilla的使用和主动模式被动模式介绍
  • .NET 使用 XPath 来读写 XML 文件
  • .net/c# memcached 获取所有缓存键(keys)
  • .NET开发人员必知的八个网站
  • @antv/x6 利用interacting方法来设置禁止结点移动的方法实现。
  • @SentinelResource详解
  • [ 隧道技术 ] cpolar 工具详解之将内网端口映射到公网
  • [.NET]桃源网络硬盘 v7.4