【问题标题】:When should you use a local class in Java?什么时候应该在 Java 中使用本地类?
【发布时间】:2023-03-14 20:56:02
【问题描述】:

我刚刚发现了 Java 中的本地类:

public final class LocalClassTest
{
  public static void main(final String[] args) {
    for(int i = 10; i > 0; i--) {
      // Local class definition--declaring a new class local to the for-loop
      class DecrementingCounter {
        private int m_countFrom;

        public DecrementingCounter(final int p_countFrom) {
          m_countFrom = p_countFrom;
        }

        public void count() {
          for (int c = m_countFrom; c > 0; c--) {
            System.out.print(c + " ");
          }
          System.out.println();
        }
      }

      // Use the local class
      DecrementingCounter dc = new DecrementingCounter(i);
      dc.count();
    }
  }
}

我确实看到了这条评论:Advantages of Local Classes,其中列出了本地类相对于匿名内部类的一些巨大优势。

我的问题是,在很多情况下,这种技术似乎不会比非匿名内部类具有优势。我的意思是:如果您的类仅在方法的范围内有用,您将使用本地类。但是当您的方法变得如此复杂时,您需要开始在其中定义自定义类,它们可能已经太复杂了,需要拆分。到那时,您的本地类必须成为内部类,对吗?

有哪些本地类比内部类更受欢迎且不涉及超复杂方法(应该避免)的示例?

【问题讨论】:

  • 啊啊啊啊啊……我的眼睛疼。 :)
  • 本地类在循环中声明????你疯了吗?您无需这样做,因为您的类不访问任何循环局部变量。这个类甚至可以很容易地外部化
  • @eugener:好吧,我想它应该在循环之外声明,但这是一个人为的例子,无论哪种方式似乎都同样荒谬......
  • 尝试使用已知的“内部类”名称而不是“本地类”...
  • 我喜欢循环内的课程。没有机会在其他地方意外使用它:)

标签: java oop


【解决方案1】:

本地类是在某些特定方法中使用的东西,在其他地方没有。

让我举个例子,当我从文件中读取配置时,我在我的 JPEG 解码器/编码器中使用了一个本地类,这将决定进一步的解码过程。它看起来像这样:

class DecodeConfig {
    int compId;
    int dcTableId;
    int acTableId;
}

基本上它只是三个ints 组合在一起。我需要一组配置,这就是为什么我不能只使用一个匿名类。如果我用 C 编码,我会使用结构。

我可以使用内部类来做到这一点,但所有解码过程都在一个方法中处理,我不需要在其他任何地方使用配置。这就是为什么一个本地类就足够了。

当然,这是最基本的例子,但它来自现实生活。

【讨论】:

  • 我相信您对这种方法有自己的理由,但如果您只是针对 C 的结构类似,使用 Enum 不是更合适的解决方案吗?
  • Enum 无法解决问题,我从文件中读取了所有值,但它们没有形成一组预定义的值。我还需要对三个不同的参数进行分组,但我不确定枚举如何帮助我做到这一点。
  • 你为什么选择让这个“结构”成为本地类而不是私有内部类?它只在一个方法中使用?您认为该方法有多复杂?
  • 没错,它没有在其他任何地方使用。这是主要原因。该方法并不复杂(顺便说一下,低于 100 SLoC),但它有两个部分。第一部分是读取几个配置并将它们存储在一个数组中。第二部分是使用这些配置来解码以下数据。这个过程是在非常高的层次上完成的,低层次的代码隐藏在其他类中。完成解码后,我不再需要这些配置。也许我应该编辑我的答案来解释为什么我在这种情况下使用本地类,我只说明了我是如何使用它的(但这是隐含的)。
  • 顺便说一句:因为 JEP 395 (openjdk.java.net/jeps/395) Java 为此提供了 Records,但是将它们放在本地仍然是一个不错的选择,不会污染其他地方的命名空间。
猜你喜欢
  • 2016-12-24
  • 2011-06-16
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 2011-04-15
  • 2017-04-10
  • 2012-03-19
  • 2018-05-12
相关资源
最近更新 更多