2010-01-15 4 views
5

Ich sah nur eine Klasse (ein großes API Modul), wo eine Menge Sachen gibt Java: verwendet eine endgültige statische int = 1 besser als nur eine normale 1?

readParamString(Object params, int index) 

wie

ist, und sie haben in dieser Klasse 10 Felder

final static int PARAM1 = 1 
... 
final static int PARAM10 = 10 

, die mit ReadParam Funktionen verwendet werden

aber man kann auch eine normale int wie readParamString(o, 1);

ist int final static verwenden irgendwie besser t Han mit einem normalen Int?

Antwort

1

Durch das Deklarieren von final static int haben Sie einen einzelnen Verweis auf die int-Variable. Und noch eine wichtige Sache ist, dass Sie den Wert von int nicht einmal als final deklariert ändern können. Wenn int nicht endgültig ist, können Sie den Wert der Variablen ändern. Also, wenn Sie nicht ändern möchten, ändern Sie den Wert der Variablen durch Out-Code, dann können Sie endgültige statische Int verwenden.

+5

inkohärent viel? –

+0

Keines dieser Dinge ist für int-Literale in Java geeignet, außer wenn der konstante Wert etwas bedeutet (was durch einen Namen wie 'NUMBER_OF_WOGGLES_IN_A_BOGGLE' im Gegensatz zu' PARAM1' angezeigt würde) – Injektilo

1

ja irgendwie besser als ein normales int

Verwendung Aber Wenn Sie mit Java 5 oder höher enum sind besser als final static Variablen.

+0

Die Methode "static final int" ist immer noch nützlich, wenn Sie mehrere Werte in einer einzigen Ganzzahl mithilfe der Ein-Hot-Codierung (wobei Sie die verschiedenen Werte bitweise ODER miteinander verknüpfen) codieren möchten. – Adamski

+0

In diesem speziellen Fall sind die endgültigen Statiken völlig nutzlos. – jarnbjo

+2

@Adamski: Für einen echten OO-Ansatz würde ich ein 'EnumSet' anstelle des Old-School-Bitwise-OR-Ansatzes empfehlen. –

15

Ein Vorteil eine statische letzte Konstante deklariert mehrere Verweise auf den gleichen Literalwert througout den Code zu verhindern, ist, die möglicherweise zu einem unerwünschten Veränderung führen könnten; z.B. wenn ein Programmierer unabsichtlich ein Literal ändert, ohne die anderen zu ändern.

In Ihrem Beispiel würde ich den Wert der Vereinbarkeit eines konstanten PARAM1 mit dem Wert 1, insbesondere die Frage, ob dies der enthaltenden Klasse ist privat und nur einmal verwiesen. Wenn jedoch der wörtliche Wert eine semantische Bedeutung hätte, wäre sie vielleicht nützlicher. z.B.

public static final int LOAD_ACTION = 1; 
public static final int SAVE_ACTION = 2; 
public static final int DELETE_ACTION = 4; 
public static final int MOVE_ACTION = 8; 

Jedoch würde normalerweise ein Enum anstelle dieses Ansatzes verwendet werden.

+2

Aber was, wenn sich der Wert von 1 ändert ?! –

+0

@John: Mein Punkt ist, dass, wenn PARAM1 nur an einer Stelle in Code verwendet wird, der für die Klasse privat ist, es wenig Wert hat, sie zu definieren. Die übermäßige Verwendung von statischen Endkonstanten kann Code unlesbar IMHO machen. – Adamski

+2

+1, magische Zahlen im Code sollten immer mit einem aussagekräftigen semantischen Namen definiert werden, um sie lesbar zu machen. – Paolo

-2

Vielleicht ist es, weil die Variable vom Compiler inlined wird.

4

Im Beispiel Sie geben, würde ich sagen, dass die genannten Werte aufweisen, ist nicht besser als nur direkt auf den int verwenden. Der Parameter ist eine Anzahl, daher ist die int-Darstellung des Parameters genauso aussagekräftig wie die benannte Version.

Dies scheint Art zu sein, wenn ich auf C-Code gelegentlich kommen, dass Dinge wie

#define ZERO 0 
#define ONE 1 

Es gibt wirklich nicht viel Sinn hat. In der Tat, wenn ich sehe, dass diese Namen verwendet werden (anstatt, wenn ich mir die Definitionen anschaue), werde ich versucht, zu den Defines zu springen, um sicherzustellen, dass die Namen nicht lügen (Es ist eine lange, lange Zeit gewesen, aber Ich bin tatsächlich auf Code gestoßen, der FALSE auf 1, -1 oder etwas ungleich Null zum Beispiel definiert hat, was wirklich, wirklich schlecht ist).


Edit: auf dem zweiten Blick scheint es, dass die Namen, das Feld im ersten Parameter angeben könnten, die von Interesse ist, in welchem ​​Fall die Namen vielleicht mehr Sinn machen - solange die Namen einig sinnvolle Bindung haben zum Feld und nicht nur zum numerischen Offset. Es ist schwer zu sagen, ob das der Fall ist oder nicht, da Sie vielleicht den Code paraphrasieren, mit dem Sie wirklich arbeiten.

9

Das dumme ist.

Der Grund numerische Konstanten zur Extraktion ist ihr einen bezeichnenden Namen zu geben. PARAM1..PARAM10 sind nicht sehr aussagekräftig.

+0

+1. Ein anderer Grund könnte sein, Referenzen zu verfolgen und sie an einem Ort zu verwalten. Aber ein aussagekräftiger Name wäre auch dort besser gewesen. – Thilo

+0

Beachten Sie, dass die dummen Namen einen einzigen Zweck haben können, nämlich ihre Verwendung mit JavaDoc zu dokumentieren. –

1

Ich denke, es ist nicht für die endgültige statische Variable getan, sondern um aussagekräftige Namen zu haben. Und deshalb ist sogar PARAMETER1 aussagekräftiger als nur 1. Dadurch kann das Verständnis beim Lesen des Codes verbessert werden.

Verwandte Themen