1

假设我有课程Project,EmployeeProjectAssignement。我有一个 enum Role,有两个值,LEADERFOLLOWER. s通过对象Employee分配给s,该对象具有类型的成员字段。ProjectProjectAssignmentroleRole

我有一个商业规则,每个项目只能有一个领导者,但可以有很多追随者。为了实现这一点,我给出Role了一个成员字段singular,即trueforLEADERfalsefor FOLLOWER。(我将来可能会添加更多角色。)我的服务器端 Java 会检查您是否尝试将多个领导者分配给一个项目并且不允许您这样做。

到目前为止,我认为我没有描述任何特别不寻常的事情。

这是尴尬的一点:我有一些(手写的)客户端 JavaScript 验证,以确保您不会将多个具有相同角色的人分配给一个项目。它对追随者有一个硬编码的例外。是否有任何干净的方法可以让 JavaScript 代码了解Role枚举,以便它可以访问该isSingular方法?

(显然,任何类型的事情实际上都必须Role在某个时候将枚举转录成 JavaScript;我想避免手动甚至半自动地这样做,因为这很快就会变得比我在更多情况下这样做更值得付出努力。 )

我没有使用 Spring 或任何类似的框架,只是简单的 .jsps。重写整个应用程序以使用类似的东西可能是一个好主意,但远远超出了问题的范围。

4

2 回答 2

2

我通常通过在页面上的一些动态生成的 Javascript 中添加查找表来解决此类问题。也许用户的 id 是关键,他们的“奇异性”是价值。或者,也许您只列出那些不那么受欢迎的人(领导者可能较少,所以只列出那些)。然后只需在 javascript 中查阅 LUT。

实际上访问 ENUM 是不可能的。相反,您必须自己弥补差距,即使这意味着构建一个完全建模服务器端对象描述的 Javascript 对象,然后复制所有数据。

于 2012-12-17T18:29:58.167 回答
1

我知道您正在寻找内置的东西,但毕竟我被拖入了半自动转换。

此函数将任何 Enum 转换为 JavaScript 对象:

public static <E extends Enum<?>> String getEnumAsJavaScript(Class<E> c)
{
  String name = c.getName().substring(c.getName().lastIndexOf('$')+1);
  String result = "var " + name + " = {";
  for (E o: c.getEnumConstants()) {
    if (o.ordinal() != 0) result += ", ";
    result += " " + o + ": "+ o.ordinal();
  }
  result += " }";
  return result;
}

给定这样的枚举和调用:

public enum Role { EMPLOYEE, LEADER }

System.out.println(getEnumAsJavaScript(Role.class));

它将生成这个 JavaScript 对象:

var Role = { EMPLOYEE: 0,  LEADER: 1 }
于 2012-12-17T20:38:50.537 回答