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
}
platformNames
할 수있다 public
, static
그리고 final
, 그러나 확실히 일정하지 않습니다. 유일한 상수 배열은 길이가 0 인 배열입니다.
static final
반드시 중복되는 것은 아닙니다. final
키워드 만있는 클래스 또는 인터페이스 필드 는 클래스 또는 인터페이스의 개체를 만들 때 해당 필드의 별도 인스턴스를 만듭니다. 를 사용 static final
하면 각 개체가 해당 필드에 대한 메모리 위치를 공유하게됩니다. 즉, MyClass 클래스에 필드가있는 final String str = "Hello";
경우 MyClass의 N 인스턴스에 대해 메모리에 필드 str의 N 인스턴스가 있습니다. static
키워드를 추가하면 인스턴스가 1 개만 생성됩니다.
static final
필요하지 않으며 인터페이스에 대해 중복됩니다.