如何从抽象类扩展枚举类?

2023-12-20

有这样的东西:

public enum Token
{
     FOO("foo", "f"),
     QUIT("quit", "q"),
     UNKNOWN("", "");
     ...

     public parse(String s) {
         for (Token token : values()) {
              ...
              return token;
         }
         return UNKNOWN;
     }
}

一个抽象类:

abstract class Base 
{
    private boolean run;

    Base() {
        run = true;

        while (run) {
             inp = getInput();
             act(inp);
        }
    }

    public boolean act(String s) {
        boolean OK = true;
        switch (Token.parse(inp)) { /* Enum */
             case FOO:
                    do_foo();
                    break;
             case QUIT:
                    run = false;
                    break;
             case UNKNOWN:
                    print "Unknown" + inp;
                    OK = false;
                    break;
             }
         }
         return OK;
    }
}

和扩展器:

class Major extends Base
{

}

我想要的是延长act就像如果super不处理它然后尝试处理它Major。例如。添加PRINT_STAT("print-statistics", "ps")- 但同时让Base类句柄默认值如QUIT.

这是一种完全错误的做法吗?

到目前为止我所做的是添加一个接口通常:

public interface BaseFace
{
      public boolean act_other(String inp);
}

而在课堂上Base implements BaseFace:

      case UNKNOWN:
          OK = act_other(inp);

而在课堂上Major:

  public boolean act_other(String inp) { 
       if (inp.equals("blah")) {
            do_blah();
            return true; 
       }
       return false;
  }

这看起来像一个可用的设计吗?

而且,主要问题是:

有没有什么好的办法可以延长Token类,这样我就可以在中使用相同的开关方法Major as in Base?我想知道是否有更好的设计,其次我是否必须为它创建一个新的 Token 类Major或者如果我可以以某种方式扩展或以其他方式重用现有的。


编辑:概念点是拥有Base我可以在处理各种类型输入的不同项目中轻松重用该类。


所有枚举都隐式扩展 Enum。在Java中,一个类最多可以扩展另一个类。

但是,您可以拥有枚举类实现一个接口.

From 这个关于 Enum 类型的 Java 教程 http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html:

注意:所有枚举都隐式扩展 java.lang.Enum。由于类只能扩展一个父类(请参阅声明类),因此 Java 语言不支持状态的多重继承(请参阅状态、实现和类型的多重继承),因此枚举不能扩展任何其他内容。

针对 Java 8 进行编辑:

从 Java 8 开始,接口可以包括默认方法 https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html。这允许您在接口中包含方法实现(但不包含状态)。尽管此功能的主要目的是允许公共接口的演变,但您可以使用它来继承定义多个枚举类之间的公共行为的自定义方法。

然而,这可能很脆弱。如果稍后将具有相同签名的方法添加到java.lang.Enum https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html类,它将覆盖您的默认方法。 (当一个方法同时在类的超类和接口中定义时,类实现总是获胜。)

例如:

interface IFoo {
    public default String name() {
        return "foo";
    }
}

enum MyEnum implements IFoo {
    A, B, C
}

System.out.println( MyEnum.A.name() );  // Prints "A", not "foo" - superclass Enum wins
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从抽象类扩展枚举类? 的相关文章

  • 当同级滚动到达末尾时打开底部工作表吗?

    有没有办法将滚动事件从一个滚动视图 转发 到我的底部工作表 以便当我过度滚动第一个滚动视图时我的底部工作表开始展开 考虑这个小应用程序 public class MainActivity extends AppCompatActivity
  • 仅使用 onBackPressureLatest() 消耗最新项目

    我有一个定期发出物品的生产者和一个有时非常慢的消费者 重要的是 消费者只使用最近的商品 我认为 onBackPressureLatest 是这个问题的完美解决方案 于是我写了如下测试代码 PublishProcessor
  • Play 2.4,错误:包play.*不存在

    我想开始使用 play 框架 2 4 4 并想遵循教程 我正在关注这个 YouTube 视频 https www youtube com watch v bLrmnjPQsZc从他们的网站 使用 play java 模板并将其导入 Inte
  • 测试前设置TestNG的输出目录

    我正在使用 Eclipse 运行一些 TestNG 测试 使用 XML 文件 右键单击 作为 TestNG 套件运行 我仅将 Maven 用于依赖项 而不用于运行测试 有没有办法在代码中设置输出目录 例如 System out printl
  • Android NDK链接器路径错误

    我目前正在处理一个使用共享库的 NDK 项目 我有两个共享库要集成 libsatprotocol so 和 libsat tanca so 所以我将这些库添加到我的 Android mk 中 这样我就可以制作一个包装器 对于 libsatp
  • Google 语音 API 凭据

    我正在尝试使用 Google Speech API 但从 Google Cloud 外部进行一些测试 在旧的测试版中 我能够指定凭据文件 但现在我无法在SpeechClient class 如何使用 Google Speech API Ja
  • 纯java adb客户端[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 ADB http developer android com tools help adb html分
  • PHP Socket Java 消息交换

    我正在尝试在 PHP 页面和正在运行的 Java 服务器之间进行通信 只是通过套接字进行简单的字符串交换 这是我处理连接的线程的 Java 代码 InputStream in clientSocket getInputStream Buff
  • 如何解决找不到 com.google.cloud.Service 的类文件

    我正在尝试将 JSON 数据上传到 gcs 由于我之前没有使用谷歌云 所以我开始将随机字符串上传到 gcs 但在创建存储服务对象时我陷入了困境 Maven 依赖
  • gwt rpc 中的会话 ID cookie

    假设我正在滚动自己的会话代码 那么在 java 中生成唯一且安全的会话 id cookie 的正确方法是什么 我不应该自己推出而是使用已经标准化的东西吗 我正在使用 gwt 和 google app engine 平台 如何使会话在浏览器
  • 配置 Restlet 以在 Google App Engine 上返回 JSP?

    我开发了一个 Restlet 应用程序 我想通过 Restlet 返回一个 URL 请求的 JSP 文件 在不使用重定向的情况下如何实现此目的 IE 假设我在 mydomain com 上有文件 contact jsp 并且我希望人们能够访
  • 如何仅通过一次映射查找来增加给定键的值?

    假设我有一张地图 var inventory mutableMapOf apples to 1 oranges to 2 我想将苹果的数量增加一个 但这不起作用 inventory apples Error 9 4 Variable exp
  • 如何在java中模拟SHIFT+鼠标按键

    我想将鼠标指针移动到特定位置并执行 SHIFT 鼠标右键单击 我可以将鼠标移动到某个位置 但无法模拟鼠标单击 Robot r new Robot r mouseMove x1 y1 我应该做什么来模拟预期的鼠标点击 我认为您只需要一点额外的
  • 为什么在 GWT(或任何 Web 应用程序)中使用命令模式?

    根据这个视频 7 50 Google 建议在其请求处理 API 之上使用命令模式 还有一个看起来很有帮助的项目gwt 调度 http code google com p gwt dispatch 实现该模式 根据 gwt 调度我需要为每个命
  • 如何在“mvn clean install”期间在 SpringBootTest 运行中禁用 ch.qos.logback 自己的 INFO 消息

    在与 RasmusFaber 获得最多支持的答案的作者 讨论后使用布局时如何防止 logback 在每个日志的开头输出自己的状态 https stackoverflow com q 3257154 2886891 我决定创建一个新问题 因为
  • 将 OraclePreparedStatement 与 DBCP 连接结合使用

    我正在尝试使用 dbcp 框架为我的 oracle 服务器创建一个连接池 我用过这个tutorial http web archive org web 20120615100115 http www freshblurbs com 80 j
  • 将 s:element 和 s:complexType 命名为相同的名称

    将 s element 和 s complexType 命名为相同名称是否合法 可以看到下面的代码 element和complextype具有完全相同的名称 这是 wsdl 文件的一大块
  • JPA:如何在不加载延迟加载集的情况下计算子记录数

    我正在编写一个 J2EE JPA Spring 3 应用程序 试图保持纯粹的 JPA 2 0 我想获得子对象的计数而不必加载它们 因为这显然是一个昂贵的操作 例如 这是一个简化的示例 Organisation OrgID OrgName E
  • 逆变方法参数类型

    wiki 逆变方法参数类型 https en wikipedia org wiki Covariance and contravariance 28computer science 29 Contravariant method argum
  • java:抛出 RuntimeException [重复]

    这个问题在这里已经有答案了 下面这一项如何正确 我希望编译器告诉我使用throws Exception or throws RuntimeException public void method1 throws NullPointerExc

随机推荐