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

Eclipse警告有关Java中私有静态嵌套类的综合访问器?

柴丰
2023-03-14
问题内容

我的同事建议使一些Eclipse代码格式和警告设置更加严格。这些更改中的大多数都是有道理的,但是我在Java中收到这一奇怪的警告。这是一些重现“问题”的测试代码:

package com.example.bugs;

public class WeirdInnerClassJavaWarning {
    private static class InnerClass
    {
        public void doSomething() {}
    }

    final private InnerClass anInstance;

    {
        this.anInstance = new InnerClass();   // !!!
        this.anInstance.doSomething();
    }
}
// using "this.anInstance" instead of "anInstance" prevents another warning,
// Unqualified access to the field WeirdInnerClassJavaWarning.anInstance

与!!使用新的警告设置在Eclipse中向我发出此警告:

对访问构造函数WeirdInnerClassJavaWarning.InnerClass()的访问由合成访问器方法模拟。增加其可见性将改善您的性能。

这是什么意思?当我将“私有静态类”更改为“受保护的静态类”时,警告消失了,这对我来说毫无意义。

编辑: 我终于弄清楚了“正确”的修复程序。这里的真正问题似乎是此嵌套的私有静态类缺少公共构造函数。一项调整消除了警告:

package com.example.bugs;

public class WeirdInnerClassJavaWarning {
    private static class InnerClass
    {
        public void doSomething() {}
        public InnerClass() {}
    }

    final private InnerClass anInstance;

    {
        this.anInstance = new InnerClass();
        this.anInstance.doSomething();
    }
}

我希望该类是一个私有的嵌套类(因此,其他任何类都不能访问它,包括封闭类的子类),而我希望它是一个静态类。

我仍然不明白,为什么使嵌套类受保护而不是私有是解决“问题”的另一种方法,但这也许是Eclipse的一个怪癖/错误。

(很抱歉,我应该称它为NestedClass而不是InnerClass以便更加清楚。)


问题答案:

您可以按照以下说明摆脱警告:

package com.example.bugs;

public class WeirdInnerClassJavaWarning {
    private static class InnerClass {
        protected InnerClass() {}  // This constructor makes the warning go away
        public void doSomething() {}
    }

    final private InnerClass anInstance;
    {
        this.anInstance = new InnerClass(); 
        this.anInstance.doSomething();
    }
}

就像其他人所说的那样,Eclipse抱怨的是,除非通过Java编译器创建的综合方法,否则无法从外部实例化没有显式构造函数的私有类。如果使用代码,对其进行编译,然后使用jad(*)对其进行反编译,则会得到以下内容(重新格式化):

public class Test {
  private static class InnerClass {
    public void doSomething() {}
    // DEFAULT CONSTRUCTOR GENERATED BY COMPILER:
    private InnerClass() {}

    // SYNTHETIC METHOD GENERATED BY THE JAVA COMPILER:    
    InnerClass(InnerClass innerclass) {
      this();
    }
  }

  public Test() {
    anInstance.doSomething();
  }

  // Your instance initialization as modified by the compiler:
  private final InnerClass anInstance = new InnerClass(null);
}

如果添加受保护的构造函数,则不需要合成代码。我认为,使用公共或受保护的构造函数,从理论上讲,合成代码比非合成代码要慢很多。

(*)对于jad,我链接到了Wikipedia页面…托管此程序的域已过期,但Wikipedia链接到了一个我未测试过的域。我知道还有其他(可能是较新的)反编译器,但这是我开始使用的反编译器。注意:当反编译最近的Java类文件时,它会
发出抱怨 ,但是它仍然做得很好。



 类似资料:
  • 问题内容: 我在Java中有一个“私有静态”嵌套类。访问修饰符对此类中的字段和方法的意义是什么?我已经尝试了公共和私有方式,但对我的申请没有影响。 问题答案: 两种嵌套类:1.静态(嵌套类)和2.非静态(也称为内部类) 现在,外部类可以访问内部类的所有成员,但是当您想要限制某些外部类访问它时,实际上您可以对类(嵌套类)的成员使用访问说明符。 有趣的读物:Source1,Source2

  • 我知道如何访问私有变量,但我正在尝试测试以下类: ProcessStatusResult: 在我的测试中,我需要在ProcessStatusBody中获取ProcessStatus来验证它,但我不知道如何做到这一点。 有没有一种方法可以使用反射(或其他方法)来访问它,而不必仅仅为了测试而在ProcessStatusResult中添加getter?

  • 如何验证是否调用了私有嵌套类的非静态方法?这就是我目前的情况: 我明白了: 更新1: @丹尼斯,我试过以下方法,不过我得到了一个。我想根据JVM中已经存在的单例验证方法的运行,而不是创建它的新实例(正如我在下面的代码中所做的那样),以便调用方法。我尝试调用,但没有成功。有没有一种方法可以使用外部类的运行实例上的反射来验证jmockit中对私有嵌套类中非静态方法的调用(通过调用)? 更新2: 尝试获

  • 我有一个关于静态方法访问的问题。我有一个类,其中有4个静态方法。如代码所示: } 我正在从下面的代码调用来自onLoadShipperDetailsListCtrl()的setSortingEnable()方法: } 因此,如果我从其他类调用setSortingEnabled()方法,我会认为它是公共的,而其他方法是私有的,但它会给我一个错误:Java . lang . nosuchmethode

  • 为什么会这样?我的意思是,访问私有变量。