当前位置: 首页 > 面试题库 >

如何通过重写方法在Java枚举中使用字段?[

袁阿苏
2023-03-14
问题内容

任务是使用java实现漂亮的策略html" target="_blank">设计模式enum

public enum MyEnum {

    FIRST {
        @Override
        public String doIt() {
            return "1: " + someField; //error
        }
    },
    SECOND {
        @Override
        public String doIt() {
            return "2: " + someField; //error
        }
    };

    private String someField;

    public abstract String doIt();

}

但是当someField我指的是

无法对非静态字段someField进行静态引用。

有什么问题,有可能做得更好吗?


问题答案:

专门enum的不过是具有内部类语义的子类。如果在编译后查看字节码,您会注意到编译器仅插入用于读取私有字段的访问器方法,但是任何专用枚举都被编译为自己的类。您可以考虑将enum其实现为:

public abstract class MyEnum {

  private static class First extends MyEnum {

    @Override
    public String doIt() {
        return "1: " + someField; //error
    }
  }

  private static class Second extends MyEnum {

    @Override
    public String doIt() {
        return "2: " + someField; //error
    }
  }

  public static final MyEnum FIRST = new First();
  public static final MyEnum SECOND = new Second();

  private String someField;

  public abstract String doIt();
}

如您所见,发生相同的编译器错误。实际上,您的问题与enums 不相关,而与它们的内部类语义有关。

但是,您发现了编译器的一个极端情况,即猜测您的代码意图并试图警告您您的意图是非法的。通常,someField任何专业人士都可以看到该字段enum。但是,有两种private从内部类访问字段的方法,只有一种是合法的:

  1. private成员不继承。因此,在超类中定义实例后,您将无法访问该private字段this

  2. 对于内部类,即使外部类的成员也可以访问private。这是由编译器通过将访问器方法插入外部类(private通过访问器方法公开字段)来实现的。static仅当内部类为non-时,才能访问non- field static。对于enums,内部类始终为static

更高的条件是编译器抱怨的是:

无法静态引用非静态字段 someField

您正在尝试staticstatic内部类访问非字段。即使该字段由于内部类的语义而在技术上是可见的,也是不可能的。您可以通过例如从超类读取值来明确指示编译器访问该值,例如:

public String doIt() {
  MyEnum thiz = this;
  return thiz.someField;
}

现在,编译器知道您正在尝试访问可见(外部)类型的成员,而不是错误地访问someField(非静态)外部类实例(不存在)的字段。(类似地,您可以编写super.someField该表述,表达了您想继承继承链而不访问外部实例字段的想法。)但是,更简单的解决方案是简单地使field成为可能protected。这样,编译器对继承可见性感到满意,并可以编译您的原始设置。



 类似资料:
  • 问题内容: 帮我了解泛型。说我有两个枚举作为内部类,如下所示: 我不想让两个枚举都实现一个接口,而不得不两次实现相同的方法,而是希望在外部类中有一个方法可以执行以下操作: 但是,此方法无法编译。我要尝试做的是找出字符串值是否为枚举值的名称(在任何枚举中),无论是蔬菜,水果,还是其他。不管这实际上是否是冗余方法,我尝试(重新)编写的方法有什么问题? 基本上我想这样做: 问题答案: 原来有几个问题:

  • 问题内容: 我试图确定如何访问JObject中的数据,但我终生无法确定如何使用它。 我可以将其打印到执行Console.WriteLine(Object)的控制台中,然后看到数据,它看起来像: 但是我不知道如何迭代/枚举它,任何人都有想法吗?我现在很茫然。 问题答案: 如果您查看相关文档,将会发现它实现了。因此,您可以使用以下命令简单地对其进行迭代:

  • 问题内容: 我中的值是需要在其中包含空格的单词,但是枚举的值中不能包含空格,因此将它们全部堆积在一起。我想重写以将这些空间添加到我告诉的位置。 当我在与添加空格相同的字符串上使用时,我还希望该枚举提供正确的枚举。 例如: 电话上的,其值是返回字符串。调用相同的字符串()会返回枚举值。 我怎样才能做到这一点? 问题答案: 您可以尝试此代码。由于无法覆盖方法,因此必须定义一个自定义方法(在下面的示例代

  • Go语言中是否有枚举的简单实现?像下面这样的东西?

  • 问题内容: 我正在尝试使用本机实现重写活动回调方法(以将Lua挂接到活动中)。但是我遇到了一个麻烦,试图在JNI代码中调用超类方法,这是回调所必需的。 例如,我有一个像这样的课程: 我正在尝试在C中这样实现: 但是,当我尝试此代码时,在自身而不是中调用,产生此错误: 我以为jmethodID是特定于类的,并且可以标识super方法,但是事实并非如此。 所以我的问题是,您如何实现这一目标… 在JNI

  • 我正在尝试检查我的VO中设置了哪些值。 下面是我的女儿。我得到的是“合格的病例标签MyEnum.UserType.Doctors必须替换为不合格的枚举常量Doctors” EnumTest.java