在 Java 编译过程中创建动态方法参数

问题描述 投票:0回答:1

大型构建器是我项目的核心,并且使用非常频繁。我想让每个方法中的每个参数都是动态的(期望 lambda 表达式作为参数)。然而,我需要创建两次以上的方法(甚至更多),但是我的构建器类已经太大了,当我向其中添加另一个方法时,我不想浪费时间。

我想对方法进行类似 lombok 注释的操作,以使方法能够同时接收

Supplier<T>
T
类型参数。当它调用某些方法时,它应该从供应商那里获取值,或者从对象中获取字段。

应该是这样的

@DynamicArguments
public void randFunc(String string, Integer value) {
   // some code
}
randFunc("word", 1) // works
randFunc(() -> "123546", 3) // works
randFunc(() -> "123456", () -> 8) // works

我尝试研究 groovy 和自定义 lombok 注释来做到这一点,但没有多大帮助。

java dynamic
1个回答
0
投票

我会使用参数构建器类。

public static class RandFuncArgs {
    private Supplier<String> string;

    private IntSupplier value;

    public RandFuncArgs() {
        string("");
        value(0);
    }

    public RandFuncArgs(String s,
                        int value) {
        string(s);
        value(value);
    }

    public String getString() {
        return s.get();
    }

    public int getValue() {
        return value.getAsInt();
    }

    public RandFuncArgs string(String s) {
        return string(() -> s);
    }

    public RandFuncArgs string(Supplier<String> s) {
        this.string = Objects.requireNonNull(s, "Argument cannot be null.");
        return this;
    }

    public RandFuncArgs value(int value) {
        return value(() -> value);
    }

    public RandFuncArgs value(IntSupplier value) {
        this.value = Objects.requireNonNull(value, "Argument cannot be null.");
        return this;
    }
}

现在你的外部类只需要一种方法:

public void randFunc(RandFuncArgs args) {
    // ...
}

其他人可以称之为:

obj.randFunc(new RandFuncArgs().string("word").value(1));
obj.randFunc(new RandFuncArgs().string(() -> "123546").value(3));
obj.randFunc(new RandFuncArgs().string(() -> "123456").value(() -> 8));
© www.soinside.com 2019 - 2024. All rights reserved.