Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从java内部的子级向最终静态变量赋值?_Java_Spring - Fatal编程技术网

如何从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启动并使用内联常量的权限时,似乎正在工作的反射代码在一段时间后崩溃了-你永远无法确定这样的代码会可靠地工作,即使它通过了几次测试。应该很好,很干净!我不知道为什么我喜欢这个解决方案,谢谢你。看看例子。漂亮干净,就像它应该的那样!我不知道为什么我喜欢这个解决方案,谢谢你。参见示例。