【发布时间】:2010-09-24 03:36:47
【问题描述】:
我正在研究一些开源 Java 项目以进入 Java,并注意到其中很多都有某种“常量”接口。
例如,processing.org 有一个名为PConstants.java 的接口,大多数其他核心类都实现了这个接口。该接口充满了静态成员。这种方法是否有原因,或者这被认为是不好的做法?为什么不使用枚举有意义的地方,或者静态类?
我觉得使用接口来允许某种伪“全局变量”很奇怪。
public interface PConstants {
// LOTS OF static fields...
static public final int SHINE = 31;
// emissive (by default kept black)
static public final int ER = 32;
static public final int EG = 33;
static public final int EB = 34;
// has this vertex been lit yet
static public final int BEEN_LIT = 35;
static public final int VERTEX_FIELD_COUNT = 36;
// renderers known to processing.core
static final String P2D = "processing.core.PGraphics2D";
static final String P3D = "processing.core.PGraphics3D";
static final String JAVA2D = "processing.core.PGraphicsJava2D";
static final String OPENGL = "processing.opengl.PGraphicsOpenGL";
static final String PDF = "processing.pdf.PGraphicsPDF";
static final String DXF = "processing.dxf.RawDXF";
// platform IDs for PApplet.platform
static final int OTHER = 0;
static final int WINDOWS = 1;
static final int MACOSX = 2;
static final int LINUX = 3;
static final String[] platformNames = {
"other", "windows", "macosx", "linux"
};
// and on and on
}
【问题讨论】:
-
注意:
static final不是必须的,对于接口来说是多余的。 -
还要注意
platformNames可能是public、static和final,但绝对不是常数。唯一的常量数组是长度为零的数组。 -
@ThomasW 我知道这已经有几年历史了,但我需要在您的评论中指出一个错误。
static final不一定是多余的。当您创建类或接口的对象时,只有final关键字的类或接口字段将创建该字段的单独实例。使用static final将使每个对象共享该字段的内存位置。换句话说,如果一个类 MyClass 有一个字段final String str = "Hello";,对于 MyClass 的 N 个实例,内存中将有 N 个字段 str 的实例。添加static关键字只会产生 1 个实例。 -
@Sintrias 是类而不是接口的情况。在接口中声明的任何字段都是隐式静态的。
-
@awgtek 感谢您的更正。我误解了 ThomasW 的评论,不知道接口在 Java 中是如何工作的。
标签: java