自学内容网 自学内容网

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)


原文地址:https://blog.csdn.net/weixin_50353846/article/details/142435375

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!