gpt4 book ai didi

java - java中带有静态字段的接口(interface)用于共享 'constants'

转载 作者:太空宇宙 更新时间:2023-11-04 12:34:52 24 4
gpt4 key购买 nike

我正在研究一些开源 Java 项目来了解 Java,并注意到其中很多都有某种“常量”接口(interface)。

例如,processing.org有一个名为 PConstants.java 的接口(interface),以及大多数其他核心类都实现此接口(interface)。该接口(interface)充满了静态成员。这种方法是否有原因,或者这被认为是不好的做法?为什么不在有意义的地方使用枚举或静态类?

我发现使用接口(interface)来允许某种伪“全局变量”很奇怪。

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

}

最佳答案

这通常被认为是不好的做法。问题在于常量是实现类的公共(public)“接口(interface)”(因为需要更好的词)的一部分。这意味着实现类将所有这些值发布到外部类,即使它们仅在内部需要。常量在整个代码中激增。一个例子是 SwingConstants Swing 中的接口(interface),它由数十个类实现,所有这些类都“重新导出”其常量(甚至是它们不使用的常量)作为自己的常量。

但不要只相信我的话,Josh Bloch also says这很糟糕:

The constant interface pattern is a poor use of interfaces. That a class uses some constants internally is an implementation detail. Implementing a constant interface causes this implementation detail to leak into the class's exported API. It is of no consequence to the users of a class that the class implements a constant interface. In fact, it may even confuse them. Worse, it represents a commitment: if in a future release the class is modified so that it no longer needs to use the constants, it still must implement the interface to ensure binary compatibility. If a nonfinal class implements a constant interface, all of its subclasses will have their namespaces polluted by the constants in the interface.

枚举可能是更好的方法。或者您可以简单地将常量作为公共(public)静态字段放在无法实例化的类中。这允许另一个类访问它们,而不会污染它自己的 API。

关于java - java中带有静态字段的接口(interface)用于共享 'constants',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37436931/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com