Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么时候应该在Java中使用本地类?_Java_Oop - Fatal编程技术网

什么时候应该在Java中使用本地类?

什么时候应该在Java中使用本地类?,java,oop,Java,Oop,我刚刚在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 {

我刚刚在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();
    }
  }
}
我确实遇到过这样的评论:它列出了本地类相对于匿名内部类的一些巨大优势

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


当局部类比不涉及超复杂方法(应该避免)的内部类更可取时,有什么例子吗?

局部类是在某些特定方法中使用的,而不是在其他任何地方

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

class DecodeConfig {
    int compId;
    int dcTableId;
    int acTableId;
}
基本上只有三个
int
s组合在一起。我需要一个配置数组,这就是为什么我不能只使用匿名类。如果我用C语言编写代码,我会使用一个结构

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


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

aahhhh。。。我的眼睛疼在循环中声明的本地类????你疯了吗?您不需要这样做,因为您的类不访问任何局部变量。这个类甚至可以是外部的easily@eugener:好吧,我想它应该在循环外声明,但这是一个人为的例子,无论哪种方式都似乎同样荒谬…尝试使用已知的“内部类”名称而不是“本地类”…我喜欢循环内的类。不可能在其他地方意外地使用它:)我相信你对这种方法有自己的理由,但是如果你只是为了C的结构,使用Enum不是一个更合适的解决方案吗?Enum不会这样做,我从文件中读取所有的值,它们不会形成一个预定义的值集。我还需要对三个不同的参数进行分组,我不确定枚举如何帮助我做到这一点。为什么选择将此“结构”设置为本地类而不是私有内部类?它只在一个方法中使用?你会说这个方法有多复杂?确切地说,它没有在其他任何地方使用过。这是主要原因。该方法并不复杂(顺便说一句,低于100 SLoC),但它有两个部分。第一部分是读取多个配置并将它们存储在阵列中。第二部分是使用这些配置来解码以下数据。这个过程是在非常高的级别上完成的,较低级别的代码隐藏在其他类中。一旦解码完成,我就不再需要这些配置了。也许我应该编辑我的答案来解释为什么我在本例中使用本地类,我只说明了我是如何使用它的(但这一事实是隐含的)。