【问题标题】:illegal to access static member while in an enum constructor在枚举构造函数中访问静态成员是非法的
【发布时间】:2022-01-29 18:01:15
【问题描述】:

我有一个枚举,并想将一个静态函数附加到它,该函数接受该枚举大小写的参数并根据某些条件返回不同的字符串。但是,这会引发一堆错误,包括“枚举常量不允许使用修饰符”和“从枚举构造函数或实例初始化程序访问静态成员是非法的……”。如何正确地将静态函数附加到枚举?由于我的上下文,这似乎确实是最明智的放置位置。

示例代码:

public enum Operation {
    SUM,
    SUBTRACT,
    PRODUCT,
    DIVIDE,


    public String display(Operation operation) {
        if (operation == this.SUM) {
            return "+";
        } else if (operation == this.SUBTRACT) {
            return "-";
        } else if (operation == this.DIVIDE) {
            return "/";
        } else {
            return "*";
        }
    }
}

【问题讨论】:

  • “将静态函数附加到枚举”是什么意思?你认为这种方法应该如何工作?现在看起来你只是想为每个枚举值分配一些符号,比如+ for SUM。您可以通过告诉枚举拥有private String symbol;,创建构造函数来为每个枚举值设置该符号,例如private Operation(String symbol){ this.symbol = symbol;},并创建像SUM("+") 这样的值。还为该符号创建 getter,例如 getSymbol(){ return symbol;}。这样您就可以拨打SUM.getSymbol() 并获得"+"

标签: java


【解决方案1】:

这看起来是您的主要问题:

public enum Operation {
    SUM,
    SUBTRACT,
    PRODUCT,
    DIVIDE,

最后一个逗号应该是分号,用于终止枚举成员常量列表。

您可能还有其他问题(我没有检查),但首先要修复该语法错误。

【讨论】:

    【解决方案2】:

    我认为你应该选择不同的方式来实现你想要实现的目标:

    public enum Operation {
        SUM("+"),
        SUBTRACT("-"),
        PRODUCT("*"),
        DIVIDE("/");
    
        private final String displayString;
    
        Operation(final String displayString) {
            this.displayString = displayString;
        }
    
        public String getDisplayString() {
            return displayString;
        }
    }
    

    几个关键点:

    1. Java 中的枚举可以有字段和构造函数,请参阅displayString 字段和单参数构造函数。
    2. Java 中的枚举可以有实例方法,你可以在其中使用实例字段,例如getDisplayString

    那么你可以如下使用它:

    final Operation sumOperation = Operation.SUM;
    final Operation divideOperation = Operation.DIVIDE;
    
    System.out.println("First operation: " + sumOperation.getDisplayString()); // First operation: +
    System.out.println("Second operation: " +  divideOperation.getDisplayString()); // Second operation: /
    

    希望对您有所帮助,如果您需要更多详细信息,请在 cmets 中描述您需要的更多信息

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-03
      • 1970-01-01
      • 2011-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-01
      相关资源
      最近更新 更多