Je suis en train de regarder quelques projets Java open source pour me familiariser avec Java et je remarque que beaucoup d'entre eux ont une sorte d'interface de "constantes".
Par exemple, traitement.org possède une interface appelée PConstants.java et la plupart des autres classes principales mettent en œuvre cette interface. L'interface est truffée de membres statiques. Y a-t-il une raison pour cette approche, ou est-ce considéré comme une mauvaise pratique ? Pourquoi ne pas utiliser les enums où cela a du sens ou une classe statique ?
Je trouve étrange d'utiliser une interface pour permettre une sorte de pseudo "variables globales".
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
}
15 votes
Note :
static final
n'est pas nécessaire, il est redondant pour une interface.0 votes
Notez également que
platformNames
peut êtrepublic
,static
yfinal
mais ce n'est certainement pas une constante. Le seul tableau constant est celui dont la longueur est nulle.0 votes
@ThomasW Je sais que cela date de quelques années, mais je devais signaler une erreur dans votre commentaire.
static final
n'est pas nécessairement redondant. Un champ de classe ou d'interface avec seulement lefinal
permet de créer des instances distinctes de ce champ au fur et à mesure que vous créez des objets de la classe ou de l'interface. Utilisation destatic final
ferait en sorte que chaque objet partage un emplacement mémoire pour ce champ. En d'autres termes, si une classe MyClass possède un champfinal String str = "Hello";
Ainsi, pour N instances de MyClass, il y aurait N instances du champ str en mémoire. En ajoutant lestatic
ne donnerait lieu qu'à une seule instance.