【问题标题】:Java enum constant value won't changeJava枚举常量值不会改变
【发布时间】:2012-08-22 13:35:45
【问题描述】:

所以这不是“我想在运行时更改一个常量值,为什么它不起作用?”之一。问题,就像提醒一样。我无法在代码中更改 Java Enum 的值。我已经进行了更改、保存并重新运行了我的程序,但代码中的值仍然保留了旧值。我正在使用 Enum.values() 方法循环遍历我的枚举常量,并且该值显示为旧值,而不是我直接输入枚举的新值。我开始怀疑我是不是疯了,或者我的程序决定不重新编译我的枚举或什么。欢迎进行健全性检查。有关我的枚举代码的全部内容以及我在何处访问这些值,请参见下文。

public enum MSSQLType implements DBType {
//String Types
CHAR(8000, -1, null, "CHAR","TEXT"),
VARCHAR(8000, -1, null, "VARCHAR", "TEXT"),
TEXT(-1, -1, null, "TEXT", "TEXT"),
NCHAR(4000, -1, null, "CHAR", "TEXT"),
NVARCHAR(4000, -1, null, "VARCHAR", "TEXT"),
NTEXT(-1, -1, null, "TEXT", "TEXT"),
//Numeric Types
BIGINT(19, -1, null, "BIGINT", "BIGINT"),
BIGINT_IDENTITY (19, -1, null, null, null),
INT(10, -1, null, "INT", "BIGINT"),
SMALLINT(5, -1, null, "SMALLINT", "BIGINT"),
TINYINT(3, -1, null, "TINYINT", "BIGINT"),
BIT(1, -1, null, "TINYINT", "BIGINT"),
DECIMAL(14, 38, null, "DECIMAL", "DECIMAL"),
NUMERIC(14, 38, null, "DECIMAL", "DECIMAL"),
MONEY(15, 4, null, "DECIMAL", "DECIMAL"),
SMALLMONEY(6,4, null, "DECIMAL", "DECIMAL"),
FLOAT(-1, 53, null, "FLOAT", "FLOAT"),
REAL(-1, 106, null, "FLOAT", "FLOAT"),
//Date/time types
DATETIME(-1, -1, "YYYY-mm-DD HH:MM:SS", "DATETIME", "DATETIME"),
SMALLDATETIME(-1, -1, "YYYY-mm-DD HH:MM:SS", "DATETIME", "DATETIME"),
//Other types
BINARY(-1,-1, null, null, null),
VARBINARY(-1,-1, null, null, null),
IMAGE(-1,-1, null, null, null),
CURSOR(-1,-1, null, null, null),
SQL_VARIANT(-1,-1, null, null, null),
TABLE(-1,-1, null, null, null),
TIMESTAMP(-1, -1, "YYYY-mm-DD HH:MM:SS", "DATETIME", "DATETIME"),
UNIQUEIDENTIFIER(-1, -1, null, null, null);

private int size;
private int precision;
private String format;
private String convertTo;
private String fallback;

MSSQLType(int size, int precision, String format, String convertTo, String fallback) {
    this.size = size;
    this.precision = precision;
    this.format = format;
    this.convertTo = convertTo;
    this.fallback = fallback;
}
public int getSize() {
    return size;
}

public int getPrecision() {
    return precision;
}

public String getFormat() {
    return format;
}

public String getConvertTo() {
    return convertTo;
}

public String getFallback() {
    return fallback;
}

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

@Override
public String toString() {
    return super.toString().replaceAll("_", " ");
}
}  

所以 REAL 的 convertTo 和 fallback 值被更改为“FLOAT”,“FLOAT”从“DOUBLE”,“DOUBLE”,但代码仍然将常量字符串“DOUBLE”分配给这两个值!这些值是这样读出的:

for (MSSQLType msSqlType : MSSQLType.values()) {
            if (typeName.equalsIgnoreCase(msSqlType.toString())) {
                this.type = msSqlType;
                return;
            }
        }

我也尝试过使用 MSSQLType.class.getEnumConstants() 得到相同的结果。

任何帮助表示赞赏。

【问题讨论】:

  • 您是否尝试过“清理和构建”您的项目(不确定在 Eclipse 中如何调用)?
  • 在你的类文件中看起来二进制版本不匹配(尽管客户端没有编译枚举...)
  • 是的,这几乎是我的第一个停靠港。甚至尝试删除现有的“.class”文件并重新构建。
  • 刚刚尝试注释掉 REAL,我自己的“找不到类型”异常被抛出,正如我所料。我真的很茫然。
  • 猜猜你也尝试过将相关类复制到新项目中?

标签: java eclipse enums constants


【解决方案1】:

您正在使用msSqlType.toString() 方法,您应该使用msSqlType.name() 方法。 enum 上的默认 toString() 方法返回 name,但如果您在 DBType 类中覆盖它,则不会返回。

 if (typeName.equalsIgnoreCase(msSqlType.name())) {
            this.type = msSqlType;
            return;
        }

【讨论】:

  • 不幸的是,这不是问题所在。我正在重写 toString() 作为我的实现的一部分,但这就是它所做的一切:@Override public String toString() { return super.toString().replaceAll("_", " "); } 我已经确认它在该代码行中返回了正确的字符串(在这种情况下,它是“REAL”)。
猜你喜欢
  • 2011-07-09
  • 1970-01-01
  • 1970-01-01
  • 2014-12-07
  • 2011-01-14
  • 1970-01-01
  • 1970-01-01
  • 2011-10-14
  • 2014-09-26
相关资源
最近更新 更多