gpt4 book ai didi

java - 字段子类访问 - 可能的最佳方式

转载 作者:行者123 更新时间:2023-12-04 05:06:49 25 4
gpt4 key购买 nike

所以我在处理程序中的首选项时遇到了一些问题。考虑到这将使用的次数,最好使用单一方法。每个变量的 setter/getter 可能会导致文件更大。

(5 个字段 * 200 到 300 个类 = 大量浪费的空间)

我试图弄清楚如何从子类中访问具有已定义和常量名称的字段。

父类(super class)是抽象的,定义在一个列表中,我可以完全访问它。这是我希望该领域的 setter/getter 所在的类。

我希望它的工作方式是这样的:

import java.lang.reflect.Field;

public class Test {

public Test() {
final B b = new B();
final C c = new C();
System.out.println(b.getFoo());
System.out.println(c.getFoo());
}

public static void main(String[] args) {
new Test();
}

public class A {

public String getFoo() {
try {
Field f = this.getClass().getField("FOO");
f.setAccessible(true);
return (String) f.get(null);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}

}

public class B extends A {

private static final String FOO = "$HOME.DIR/lib/res/image1.png";

}

public class C extends A {

private static final String FOO = "$HOME.DIR/lib/res/image2.png";

}

}

不出所料,那没有用。类(class) A不包含字段“FOO”。理想情况下,如果它成功了,我会期望它打印出来:

$HOME.DIR/lib/res/image1.png
$HOME.DIR/lib/res/image2.png



我(到目前为止)看到的方式是可能的:
  • 反射(reflection)
  • 使用 setter/getter - 想避开
  • 使用注解

  • 使用注释是我认为可行的一种方式,但我通常不喜欢它们的整体概念,但如果这是唯一的方式,我当然会接受它。

    感谢您阅读本文,希望您能提供见解。

    最佳答案

    您能否更详细地描述您的更高级别的问题,因为听起来您可以进行一些设计更改来缓解此问题。通常,通过反射访问父类的子类字段似乎是个坏主意。

    但是,话虽如此,您需要使用 getDeclaredField而不是 getField为了通过反射访问私有(private)字段。

    例如。

    public String getFoo() {
    try {
    Field f = this.getClass().getDeclaredField("FOO");
    f.setAccessible(true);
    return (String) f.get(null);
    } catch (Exception e) {
    e.printStackTrace();
    return null;
    }
    }

    关于java - 字段子类访问 - 可能的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15439730/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com