【问题标题】:Java enum for use across class跨类使用的 Java 枚举
【发布时间】:2012-07-13 14:28:12
【问题描述】:

我在声明可以在特定类的所有函数中使用的数据库字段类型的枚举时遇到问题。使用以下代码,我得到“无法将 USERNAME 解析为变量类型”:

public class SQL_access {

    public enum DBfields { BLANK, USERNAME, ID, PASSWORD, FIRSTNAME, LASTNAME }; 

    public boolean loginValidate( String username, String password ){

        String DBuser, DBpass;
        PreparedStatement table = connectToTable( "firstsql", "users");
        ResultSet row = table.executeQuery();;

        while(row.next()){
            DBuser = row.getString(USERNAME);
            if(DBuser.equals(username)){
                DBpass = row.getString(PASSWORD);
                break;
            }
        }
    }
};

【问题讨论】:

    标签: java class enums enumeration


    【解决方案1】:

    您需要使用DBfields.USERNAME

    更新:

    为了与getString(String) 方法一起使用,您需要使用枚举的名称,例如:Dbfields.USERNAME.name()

    如果您仅将枚举用于 jdbc API 访问,则最好只使用字符串常量:

    public static final String DBFIELD_USERNAME = "USERNAME";
    

    【讨论】:

    • 我试过了,得到这个错误:ResultSet 类型中的方法 getString(int) 不适用于参数(SQL_access.DBfields)
    • getString(xxx) 需要 int 作为参数,而不是 String。一开始也做错了。但现在更新了我的帖子。
    • @Simulant - 有getString(int)(按位置获取)和getString(String)(按列名获取)。
    【解决方案2】:

    需要引用枚举类型:DBfields.USERNAME,或者静态导入枚举如:

    import static mypackage.SQL_access.DBfields.*;
    

    另外,就您而言,这还不够。您需要将列名——String——或列位置——int——传递给ResultSet

    row.getString(DBfields.USERNAME.name());
    

    这样使用,您会失去枚举的主要优势,即它的静态特性,但如果您将这些值称为“包”,它在代码中的其他地方仍然有用。

    【讨论】:

      【解决方案3】:

      您应该使用DBfields.USERNAME 访问枚举。

      请参阅Oracle Docs 了解更多信息。

      【讨论】:

        【解决方案4】:

        尝试使用枚举类型限定枚举数:

           while(row.next()){
                DBuser = row.getString( DBfields.USERNAME);
                if(DBuser.equals(username)){
                    DBpass = row.getString( DBfields.PASSWORD);
                    break;
                }
            }
        

        【讨论】:

          【解决方案5】:

          当你引用一个枚举时,它总是以这种形式 EnumName.Field。在您的示例中,您需要以下内容:

          DBUser = row.getString(DBfields.USERNAME);  
          DBpass=row.getString(DBfields.PASSWORD);
          

          【讨论】:

            【解决方案6】:

            要访问您的枚举,请使用DBfields.USERNAME,但这对您没有帮助,因为 row.getString() 需要一个 int 作为参数。您的枚举属于类型 DBFields 而不是 int。 最好使用public static final int USERNAME = the int value here;row.getString(USERNAME); 打电话。

            【讨论】:

            • 感谢您的回答,但这太混乱了=/我将只使用我猜的实际整数
            • 使用final static int USERNAME = 1; 声明,您的访问代码将获得一个可读的名称。
            【解决方案7】:

            错误方式。您需要使用DBfields.PASSWORD调用enum

            【讨论】:

              【解决方案8】:

              你需要这样调用:DBfields.PASSWORD

              【讨论】:

                猜你喜欢
                • 2011-06-05
                • 2021-02-04
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2021-12-22
                • 1970-01-01
                相关资源
                最近更新 更多