如何将字符串参数从一组允许值传递给函数

How to pass a String parameter to a function from a set of allowed values

我正在制作自己的 Java class 调用 SelectRequestBuilder 以便轻松创建 SQL 请求。有一个函数 addColumnToSelect 必须将列名作为参数。问题是我想确保用户指定的列名在 table 中,他想从中获取 select 信息。

所以我认为参数 column_name 的类型应该是 enum 像这样:

public enum USER_COLUMN {
    ID("id"),
    USERNAME("username"),
    PASSWORD("password"),

    private final String name;
    USER_COLUMN(String name) {this.name = name;}

    @Override
    public String toString() {
        return name;
    }
}

然后,在我的函数中我可以获得列名,并且我可以确保作为参数传递的列名是有效的。

然而,当我希望能够将此 class 不仅扩展到 users table,而且扩展到每个 table 时,我遇到了困难。我的意思是,例如,我的 SelectRequestBuilder 必须能够 select 来自其他 table genders 的值。 它带来麻烦的原因是我的函数不能再使用类型为 USER_COLUMN 的参数 column_name 因为它仅适用于 users table.

最后,我的解决方案是这样的:

private void addColumnToSelect(USER_COLUMN col) {
    addColumnToSelect(col.toString());
}

private void addColumnToSelect(GENDER_COLUMN col) {
    addColumnToSelect(col.toString());
}

private void addColumnToSelect(ROLE_COLUMN col) { // Role is an other table
    addColumnToSelect(col.toString());
}

private void addColumnToSelect(String col_name) {...}

但是这个解决方案并不令人满意,因为我必须为数据库中的每个 table 创建一个其他函数。这就是为什么我问你这个问题,我希望你能帮助找到一个更令人满意的解决方案! :)

枚举可以实现接口,你可以利用它来发挥你的优势:

interface DatabaseColumn {
  String columnName();
}


enum UserColumns implements DatabaseColumn {
  ID("id"),
  USERNAME("username"),
  PASSWORD("password");

  private final String name;

  UserColumns(String name) {
    this.name = name;
  }

  @Override public String columnName() {
    return name;
  }
}

那么其他枚举也可以实现相同的接口,你的签名就变成了

private void addColumnToSelect(DatabaseColumn col) {

}