Java 方法参数默认值新方案:使用DefArgs!

2025-12-04 0 952

header.png

DefArgs

Java 方法参数默认值新方案:使用DefArgs!
Java 方法参数默认值新方案:使用DefArgs!
License: MIT

一个 Java 注解处理器,通过 @DefaultValue@Omittable 注解为方法参数提供默认值支持和重载方法生成。

快速开始

在 Maven 项目中添加依赖(查看最新版本):

<dependency>
    <groupId>io.github.thirty30ww</groupId>
    <artifactId>defargs</artifactId>
    <version>LATEST</version> 
</dependency>

使用方法

具体类使用 @DefaultValue

为具体类的方法参数添加 @DefaultValue 注解,编译器会自动生成带默认值的重载方法。

public class UserService {
    public void createUser(
        String name,
        @DefaultValue(\"18\") int age,
        @DefaultValue(\"true\") boolean active
    ) {
        // 实现逻辑
    }
}

编译后自动生成:

// 生成的重载方法 1
public void createUser(String name, int age) {
    createUser(name, age, true);
}

// 生成的重载方法 2  
public void createUser(String name) {
    createUser(name, 18, true);
}

现在你可以用更简洁的方式调用:

service.createUser(\"Alice\");              // 使用全部默认值
service.createUser(\"Bob\", 25);            // 部分使用默认值
service.createUser(\"Charlie\", 30, false); // 不使用默认值

接口和抽象类使用 @Omittable

对于接口或抽象类的抽象方法,使用 @Omittable 注解标记可省略的参数。编译器会生成对应的抽象重载方法。

public interface UserRepository {
    User findUser(
        String name,
        @Omittable int age,
        @Omittable boolean active
    );
}

编译后自动生成抽象重载方法:

// 生成的抽象重载方法 1
User findUser(String name, int age);

// 生成的抽象重载方法 2
User findUser(String name);

在实现类中,使用 @DefaultValue 提供具体的默认值:

public class UserRepositoryImpl implements UserRepository {
    @Override
    public User findUser(
        String name,
        @DefaultValue(\"18\") int age,
        @DefaultValue(\"true\") boolean active
    ) {
        // 实现逻辑
        return new User(name, age, active);
    }
    // 编译器会自动为实现类生成带默认值的重载方法
}

工作原理

注解处理器会扫描所有带 @DefaultValue@Omittable 注解的方法参数,并在编译时直接修改 AST(抽象语法树),将生成的重载方法添加到同一个类或接口中。这意味着生成的代码与手写代码完全相同,没有任何性能开销。

注意事项

1. 注解使用规则

  • @DefaultValue:只能用于具体方法(有方法体的方法)
  • @Omittable:只能用于抽象方法(接口或抽象类的抽象方法)
  • 同一个参数不能同时使用两个注解
// 正确:具体方法使用 @DefaultValue
public void method(int a, @DefaultValue(\"1\") int b) { }

// 正确:抽象方法使用 @Omittable
abstract void method(int a, @Omittable int b);

// 错误:抽象方法不能使用 @DefaultValue
abstract void method(int a, @DefaultValue(\"1\") int b);

// 错误:具体方法不能使用 @Omittable
public void method(int a, @Omittable int b) { }

2. 可省略参数必须从右向左连续

// 支持
void method(int a, @DefaultValue(\"1\") int b, @DefaultValue(\"2\") int c)

// 不支持
void method(@DefaultValue(\"1\") int a, int b, @DefaultValue(\"2\") int c)

3. 不要手动定义冲突的重载方法

如果手动定义了与生成方法签名相同的重载方法,编译时会报错:

public int test(int a, @DefaultValue(\"2\") int b) {
    return a + b;
}

public int test(int a) {  // 编译错误:此方法会自动生成
    return a + 1;
}

编译错误信息:

【DefaultValue】 已在类 com.example.MyClass 中定义了方法 test(int)

4. 支持的类型

@DefaultValue 注解目前支持以下类型的默认值:

  • 基本类型byteshortintlongfloatdoublebooleanchar
  • 包装类型ByteShortIntegerLongFloatDoubleBooleanCharacter
  • 字符串类型String

@Omittable 可以用于任何类型的参数,包括基本类型、包装类型和字符串类型。

IntelliJ IDEA 支持

如果你使用 IntelliJ IDEA,建议安装配套的 defargs-intellij-plugin ,以获得更好的开发体验。插件会让 IDEA 识别这些生成的重载方法,消除错误提示并提供代码补全。

构建项目

mvnw clean install

协议

MIT License

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

申明:本文由第三方发布,内容仅代表作者观点,与本网站无关。对本文以及其中全部或者部分内容的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。本网发布或转载文章出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,也不代表本网对其真实性负责。

左子网 开发教程 Java 方法参数默认值新方案:使用DefArgs! https://www.zuozi.net/3476.html

常见问题
  • 1、自动:拍下后,点击(下载)链接即可下载;2、手动:拍下后,联系卖家发放即可或者联系官方找开发者发货。
查看详情
  • 1、源码默认交易周期:手动发货商品为1-3天,并且用户付款金额将会进入平台担保直到交易完成或者3-7天即可发放,如遇纠纷无限期延长收款金额直至纠纷解决或者退款!;
查看详情
  • 1、描述:源码描述(含标题)与实际源码不一致的(例:货不对板); 2、演示:有演示站时,与实际源码小于95%一致的(但描述中有”不保证完全一样、有变化的可能性”类似显著声明的除外); 3、发货:不发货可无理由退款; 4、安装:免费提供安装服务的源码但卖家不履行的; 5、收费:价格虚标,额外收取其他费用的(但描述中有显著声明或双方交易前有商定的除外); 6、其他:如质量方面的硬性常规问题BUG等。 注:经核实符合上述任一,均支持退款,但卖家予以积极解决问题则除外。
查看详情
  • 1、左子会对双方交易的过程及交易商品的快照进行永久存档,以确保交易的真实、有效、安全! 2、左子无法对如“永久包更新”、“永久技术支持”等类似交易之后的商家承诺做担保,请买家自行鉴别; 3、在源码同时有网站演示与图片演示,且站演与图演不一致时,默认按图演作为纠纷评判依据(特别声明或有商定除外); 4、在没有”无任何正当退款依据”的前提下,商品写有”一旦售出,概不支持退款”等类似的声明,视为无效声明; 5、在未拍下前,双方在QQ上所商定的交易内容,亦可成为纠纷评判依据(商定与描述冲突时,商定为准); 6、因聊天记录可作为纠纷评判依据,故双方联系时,只与对方在左子上所留的QQ、手机号沟通,以防对方不承认自我承诺。 7、虽然交易产生纠纷的几率很小,但一定要保留如聊天记录、手机短信等这样的重要信息,以防产生纠纷时便于左子介入快速处理。
查看详情

相关文章

猜你喜欢
发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务