【问题标题】:How could I extend java.util.Scanner class to add a nextChar() method?如何扩展 java.util.Scanner 类以添加 nextChar() 方法?
【发布时间】:2013-10-13 00:20:22
【问题描述】:

这个问题纯粹是学术性的(我是从 C# 背景进入 Java 的)。

我想知道如何扩展 java.util.Scanner 类以添加 Scanner.nextChar() 方法。

(请注意,答案可能不是针对Scanner.nextChar(),而只是关于扩展本机类的一般步骤。非常感谢。)

【问题讨论】:

  • 至少在特定情况下,您不需要。如果您确实需要一次读取一个字符,请改用BufferedReader 之类的东西。
  • 您可以使用 Scanner.read() 读取字符串并使用拆分方法将字符串分解为字符:Scanner.read().toCharArray()。这可能不是您想要的,但它可能会产生相同的结果。
  • Scanner 不是 Java 意义上的原生类。

标签: java


【解决方案1】:

Scanner 是一个final 类,你不能扩展它。如果它是一个非最终类,你可以扩展它。正如 Dennis 建议的那样,您可以使用 BufferedReader#Read 方法读取单个字符。

也许扩展Reader 并模拟一个BufferedReader

【讨论】:

    【解决方案2】:

    由于Scannerfinal,你不能声明它的子类。期间。

    • 反射不起作用/有帮助。
    • 字节工程技巧不起作用/帮助。

    可以想象,您可以修改 Scanner 类以删除 final 修饰符。然而,这是类在保留包之一中的事实意味着您需要修改 Java 安装以实现这一点。 (您也可以通过修改引导类路径来做到这一点……但那是一样的。)

    但说实话,如果真的没有必要修改Scanner。相反,您可以简单地复制 Scanner 源代码(例如,来自 OpenJDK 代码库)并使用它在应用程序的包空间中创建一个具有额外方法的“不相关”类。它不会在类型方面与真正的 Scanner 类相关,但这不太可能成为问题。


    记录在案:

    • 此问答 - https://stackoverflow.com/a/18746676/139985 - 提供了 Scanner 不支持 readChar 的一些可能原因。 (当然要注意这显然是“意见”。)

    • 使Scanner 最终确定的最可能原因是安全性。 final Scanner 类意味着Scanner 实例可以在沙盒环境中从不受信任的代码安全地传递到受信任的代码。

    【讨论】:

      【解决方案3】:

      要模拟nextChar,您可以尝试使用带有空分隔符的next

      Scanner s = new Scanner("a\nb\tcd\re");
      Pattern original = s.delimiter();// in case you wnat to get back to
                                      // default delimiter
      
      s.useDelimiter("");
      
      while (s.hasNext()) {
          char c = s.next().charAt(0);
          System.out.println("'" + c + "'");
      }
      

      结果

      'a'
      '      (here is printed value of `\n`) 
      '
      'b'
      '   '  (here is printed value of `\t`) 
      'c'
      'd'
      '      (here is printed value of `\r`) 
      '
      'e'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-24
        • 2023-03-18
        • 2013-03-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多