如何从java内部的子级向最终静态变量赋值?
假设我们有这样一个层次结构:如何从java内部的子级向最终静态变量赋值?,java,spring,Java,Spring,假设我们有这样一个层次结构: class Parent { public static final String BASE_NAME = "parent"; public static final String X_URL = BASE_NAME + "/x"; public static final String Y_URL = BASE_NAME + "/y"; } class ChildA extends Parent { public static final Stri
class Parent {
public static final String BASE_NAME = "parent";
public static final String X_URL = BASE_NAME + "/x";
public static final String Y_URL = BASE_NAME + "/y";
}
class ChildA extends Parent {
public static final String BASE_NAME = "childA";
public static final String X_URL = BASE_NAME + "/x";
public static final String Y_URL = BASE_NAME + "/y";
@RequestMapping(value= X_URL)
public String renderXPage(){...}
}
正如您可以看到的,X_URL和Y_URL在父级和子级中都在重复,如果子级可以向父级输入自己的基本名称,我们可以消除这些常量的重复,然后我们可以将它们用于注释值。如何在Java中做到这一点?没有可靠的方法来实现这一点 您可以在类上有@RequestMapping注释,并将URL的基本部分放在那个里 例如:
@RequestMapping("ChildA")
class ChildA {
@RequestMapping(value= "x")
public String renderXPage(){...}
}
renderXPage将处理ChildA/xURL。无法可靠地实现这一点 您可以在类上有@RequestMapping注释,并将URL的基本部分放在那个里 例如:
@RequestMapping("ChildA")
class ChildA {
@RequestMapping(value= "x")
public String renderXPage(){...}
}
renderXPage将处理ChildA/xURL。使用@talex的解决方案,我想出了这个简洁的解决方案:
public interface CommonRelativeUrls {
String X_URL = "/x";
String Y_URL = "/y";
}
public interface Entities {
String CLASS_A = "class-a";
String CLASS_B = "class-b";
...
}
@RequestMapping(value = Entities.CLASS_A)
public class ClassA implements CommonRelativeUrls {
@RequestMapping(value= X_URL)
public String renderXPage(){...}
}
使用@talex的解决方案,我得出了这个简洁的解决方案:
public interface CommonRelativeUrls {
String X_URL = "/x";
String Y_URL = "/y";
}
public interface Entities {
String CLASS_A = "class-a";
String CLASS_B = "class-b";
...
}
@RequestMapping(value = Entities.CLASS_A)
public class ClassA implements CommonRelativeUrls {
@RequestMapping(value= X_URL)
public String renderXPage(){...}
}
如果这是可能的,那么它将违反静态最终修饰符。因此这是不可能的。@pvpkiran也许有一个黑客可以做到这一点-在Parent中,公共静态最终字符串X_URL=ChildA.BASE_NAME+/X?是否要执行此操作?@Hulk final静态字段可能被编译器视为常量,因此它可以在类加载时内联。这意味着,即使你用一些技巧修改它,它可能已经在注释中了。@talex是的,没错。在我链接到的问题中,当JIT启动并使用内联常量的权限时,似乎正在工作的反射代码在一段时间后崩溃了-你永远无法确定这样的代码是否能可靠工作,即使它通过了几个测试。如果这是可能的,那么它将违反静态最终修饰符。因此这是不可能的。@pvpkiran也许有一个黑客可以做到这一点-在Parent中,公共静态最终字符串X_URL=ChildA.BASE_NAME+/X?是否要执行此操作?@Hulk final静态字段可能被编译器视为常量,因此它可以在类加载时内联。这意味着,即使你用一些技巧修改它,它可能已经在注释中了。@talex是的,没错。在我链接到的问题中,当JIT启动并使用内联常量的权限时,似乎正在工作的反射代码在一段时间后崩溃了-你永远无法确定这样的代码会可靠地工作,即使它通过了几次测试。应该很好,很干净!我不知道为什么我喜欢这个解决方案,谢谢你。看看例子。漂亮干净,就像它应该的那样!我不知道为什么我喜欢这个解决方案,谢谢你。参见示例。