Java 语言常用的技巧

Java 语言常用的技巧

如何让函数支持out参数

Java 语言函数是不支持out参数的,这在有些时候非常不方便,比如C#经常用到的 boolean tryParseInt(String input, out int result) 函数, 函数返回值返回是否可以成功转换, 还需要一个参数能返回转换后的数值. 很多人使用容器类作为这个out参数, 代码比较难看, 我认为最优雅的方式是是使用 AtomicReference 类型(或 AtomicInteger等)变量来作为 out 参数.

Java 语言函数传参都是按值传递的, 没有按引用传递之说, 即使是非原始类型(一般对象类)也是按照值传递的, 可以理解为Java 传递的是对象引用(内存地址)的副本.
总结:

  • AtomicReference 类型(或 AtomicInteger等)变量, 可以起到out参数效果
  • 自定义类对象: 可以起到out参数效果, 有时候显得大材小用
  • 数组或集合类对象, 可以起到out参数效果, 但可读性差
  • String, Integer, Boolean: 不可以, 因为是不可变对象
  • int, boolean, 不可以, 按值传递
    public static boolean tryParseInt(String input, AtomicInteger result) {
        result.set(10);
        return true;
    }

    public static boolean tryParseInt(String input, AtomicReference<Integer> result) {
        result.set(10);
        return true;
    }

如何让函数返回多个值

当函数返回多个值的时候, 通常做法是自定义了包含多个属性的结果类, 但如果这个结果类只是使用一次, 总觉得有点多此一举. C#和Python支持 tuple, Java 可以使用 apache common-lang 库的 ImmutablePairImmutableTriple .

Interface 中定义 default 函数的作用

接口中一般中仅仅包含方法的签名, 没有具体实现. Java 8引入了default方法, interface中的这类方法可以包含实现, 作用有: (1) 避免在接口中引入了新方法后, 要求所有实现类都必须实现该方法才行. (2) 编程范式中一直强调组合优于继承, interface 提供一个default实现后, 可以避免将这个共用方法实现放到一个基类中.

interface Animal {

    public void eat(); 

    public default void sleep() {
        System.out.println("sleep");
    }
}

record 类型

Java 17之后正式引入了 Record 类, 简化了数据类的定义, 这是一个不可变数据类型, java自动提供 equals()/hashCode()/toString()方法, 大大减少了样板代码.

posted @ 2026-05-21 20:31  harrychinese  阅读(17)  评论(0)    收藏  举报