Java记录压缩构造函数字段迭代[已关闭]

uinbv5nw  于 2023-02-11  发布在  Java
关注(0)|答案(2)|浏览(173)

已关闭。此问题需要details or clarity。当前不接受答案。
**想要改进此问题?**添加详细信息并通过editing this post阐明问题。

2天前关闭。
Improve this question
对于java记录,是否有一种方法可以在紧凑构造函数中迭代值?我不认为我可以在这里使用反射,因为从技术上讲,对象还没有构造。

record MyObject(int a, String b, LocalDate c) {

    public MyObject {
        // Iterate over values of a, b, c
    }

}
rdlzhqv9

rdlzhqv91#

这里没有神奇的语法,但是您总是可以将它们 Package 在一个数组或列表中,以便于迭代:

for (int arg : Arrays.asList(a, b, c)) {
    ...
}
but5z9lq

but5z9lq2#

如果您确实需要它(提示:你不需要),下面是你如何将它与反射结合起来:

public static void main(String args[]) {
    new MyObject(1, "2", LocalDate.now());
}

private static void printArgs(Object... args) {
    try {
        StackTraceElement caller = Thread.currentThread().getStackTrace()[2];
        Parameter[] params = Class.forName(caller.getClassName())
                .getDeclaredConstructors()[0].getParameters();
        for (int i = 0; i < args.length; i++) {
            System.out.println(params[i].getName() + " = " + args[i]);
        }
    } catch (ClassNotFoundException e) {}
}

record MyObject(int a, String b, LocalDate c) { 
    public MyObject {
        printArgs(a, b, c);
    }
}

输出:

a = 1
b = 2
c = 2023-02-07

或者,您可以从匿名类捕获构造函数,而不是依赖堆栈跟踪:

abstract static class ParamCapture {
    private final Parameter[] params = getClass().getEnclosingConstructor().getParameters();
    private final Object[] args;
    
    ParamCapture(Object... args) {
        this.args = args;
    }
    
    void print() {
        for (int i = 0; i < args.length; i++) {
            System.out.println(params[i].getName() + " = " + args[i]);
        }
    }
}

record MyObject(int a, String b, LocalDate c) {
    public MyObject {
        new ParamCapture(a, b, c) {}.print();
    }
}

相关问题