Estou olhando alguns projetos Java de software livre para entrar em Java e observei que muitos deles têm algum tipo de interface de 'constantes'.
Por exemplo, processing.org tem uma interface chamada PConstants.java , e a maioria das outras classes principais implementam essa interface. A interface está repleta de membros estáticos. Há um motivo para essa abordagem ou isso é considerado uma prática inadequada? Por que não usar enums onde faz sentido ou uma classe estática?
Acho estranho usar uma interface para permitir algum tipo de pseudo 'variáveis globais'.
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
pode ser public
, static
e final
, mas definitivamente não é uma constante. A única matriz constante é uma com comprimento zero.
static final
não é necessariamente redundante. Um campo de classe ou interface com apenas a final
palavra - chave criaria instâncias separadas desse campo à medida que você cria objetos da classe ou interface. Usar static final
faria com que cada objeto compartilhasse um local de memória para aquele campo. Em outras palavras, se uma classe MyClass tivesse um campo final String str = "Hello";
, para N instâncias de MyClass, haveria N instâncias do campo str na memória. Adicionar a static
palavra - chave resultaria em apenas 1 instância.
static final
não é necessário, é redundante para uma interface.