【发布时间】:2016-10-02 16:20:19
【问题描述】:
我有一个类包含:
- 一个公共的、静态的内部枚举
- 引用 int 和枚举的私有常量
- 私有内部类
从内部类内部引用枚举常量会生成合成访问器警告,但引用 int 常量不会。
这是为什么?如何在不使枚举常量包范围或禁用警告的情况下防止此警告? (例如,也许通过显式访问器?)
重现问题的代码:
public class Outer {
public static enum Bar {
A, B, C;
}
private static final int FOO = 0;
private static final Outer.Bar BAR = Outer.Bar.A;
private class Inner {
{
int foo = Outer.FOO; // just fine
Outer.Bar bar = Outer.BAR; // synthetic accessor method warning
}
}
}
【问题讨论】:
-
这只是一个猜测,但这可能是因为编译器可以优化原始整数存储并使其成为真正的编译时常量(意味着不会发生合成访问器调用),而枚举赋值,使用一个合适的对象,必须在运行时发生。
-
我无法使用 Java 8 重现警告
-
这个警告来自哪里?你用的是什么编译?
-
@YassinHajaj - 警告是编译器特定的,取决于您的警告选项。我相信 Eclipse 编译器是喜欢这个警告的那个。 IMO 警告比它声称要解决的问题更有害。绝大多数情况下,这些合成方法都是“有效”的有用胶水。关于每个潜在性能问题的警告都是一个滑坡,即使我想走下那个坡,我也不会从这些方法开始。
标签: java