我的同事建议将几个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
Run Code Online (Sandbox Code Playgroud)
与!!!线!使用我的新警告设置在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(); …Run Code Online (Sandbox Code Playgroud) 我在编译时得到一个我没想到的匿名类.相关代码如下,然后更详细的解释:
CircuitType.java的整体:
public enum CircuitType { V110A20, V110A30, V208A20, V208A30 }
Run Code Online (Sandbox Code Playgroud)
来自Auditor.java,第3-9行:
public class Auditor {
private String[] fileNames;
private int numV110A20;
private int numV110A30;
private int numV208A20;
private int numV208A30;
Run Code Online (Sandbox Code Playgroud)
来自Auditor.java,第104-121行:
[...]
switch (newCircuit.getType()) {
case V110A20:
this.numV110A20++;
break;
case V110A30:
this.numV110A30++;
break;
case V208A20:
this.numV208A20++;
break;
case V208A30:
this.numV208A30++;
break;
default:
System.err.println("An Error Has Occured.");
System.exit(-1);
break;
}
[...]
Run Code Online (Sandbox Code Playgroud)
从Circuit.java,第1-5行:
public class Circuit {
private CircuitType myType;
public CircuitType getType() {
return this.myType;
}
[...]
Run Code Online (Sandbox Code Playgroud)
当命令
javac *.java …Run Code Online (Sandbox Code Playgroud)