【发布时间】:2013-03-15 18:32:32
【问题描述】:
所以我在处理程序中的首选项时遇到了一些问题。考虑到这将使用的次数,最好使用单一方法。每个变量的吸气剂可能会导致文件更大。
(5 个字段 * 200 到 300 个类 = 大量浪费空间)
我正在尝试弄清楚如何从子类中访问具有已定义和常量名称的字段。
超类是抽象的,定义在一个列表中,我可以完全访问它。这是我希望该领域的吸气剂所在的类。
我希望它的工作方式是这样的:
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";
}
}
不出所料,这不起作用。 A 类不包含字段“FOO”。理想情况下,如果它成功了,我会期望它会打印出来:
$HOME.DIR/lib/res/image1.png
$HOME.DIR/lib/res/image2.png
我(到目前为止)认为这是可能的方式:
- 反射
- 使用 Getter - 希望避免
- 使用注释
使用注释是我认为可行的一种方式,但我通常不喜欢它们的整体概念,但如果这是唯一的方式,我当然会接受它。
感谢您阅读本文,希望您能提供见解。
【问题讨论】:
-
我想知道为什么将
private static final String FOO = "$HOME.DIR/lib/res/image2.png";放在子类中比将public String getFOO() { return "$HOME.DIR/lib/res/image2.png"}放在子类中更容易,因为两者的字符长度大致相同并且都可以通过剪切/粘贴/键入所有 200-300 个子类。 (您可以使用一个属性文件,其中的所有字符串都由类的名称索引,例如B=$HOME.DIR/lib/res/image2.png和 A 中的 getFoo() 方法。) -
这既是为了学习、扩展(希望开放 API),也是为了真正消除混乱。我真的只是将
private static final放在前面用于演示目的,但根本不需要这些。它只会有一个实例,所以不需要像那样只维护一个变量。
标签: java reflection annotations field getter