public static final int STYLE_1 = 1;
public static final int STYLE_2 = 1<<1;
public static final int STYLE_3 = 1<<2;
public static final int STYLE_4 = 1<<3;
...
public static final int STYLE_12 = 1<<12;
public static final int STYLE_1 = 1;
public static final int STYLE_2 = 2;
public static final int STYLE_3 = 4;
public static final int STYLE_4 = 8;
...
public static final int STYLE_12 = 4096;
Nein.Ist das so richtig?
Verstehe ich nicht. So wie es jetzt ist kann ich doch mit einem Byte locker 8 Styles darstellen. Wenn ich für jeden Style ne eigene Variable einführen würde, wären das 8 Variablen und somit mehr Speicher. Wieso ist da Platzverschwendung kein Argument?
Platzverschwendung? Hallo? 2009?
Hallo,
ursprüngliche Frage bezog sich ja vorallem darauf, warum die SWT Klasse die StyleBits so setzt und nicht anders. Also warum z.B. die TRANSPARENCY_MASK mit 1<<1 initialisiert wird und man nicht einfach TRANSPARENCY_MASK = 2 oder sowas schreibt.
Ich könnt ja auch ein boolean machen Transparence_Mask = true und Border = tue und dann prüfen welche Werte true sind. Das funktioniert doch genauso
Wurde doch längst beantwortet: 1<<1 ist wesentlich eindeutiger als 2, wenn man mit der Binärdarstellung rechnen will. Du siehst sofort, welches Bit gesetzt ist. Und Du siehst vor allem sofort, dass auch wirklich nur ein Bit gesetzt ist. Das ist ja grade, um die eindeutig und reproduzierbar per OR zu kombinieren.Also warum z.B. die TRANSPARENCY_MASK mit 1<<1 initialisiert wird und man nicht einfach TRANSPARENCY_MASK = 2 oder sowas schreibt.
Das kannst Du ja auch machen, wenn Du sehr wenige Flags brauchst. Brauchst Du aber viele Flags, dann wird das furchtbar unübersichtlich.Ich könnt ja auch ein boolean machen Transparence_Mask = true und Border = tue und dann prüfen welche Werte true sind. Das funktioniert doch genauso
Typsicherheit ist immer was nettes, aber für SWT ist das mit den Style Bits gar nicht so schlecht.
Es gibt schließlich auch sehr leichte Widgets, wie TreeItems von denen es potentiell sehr sehr viele geben kann und da sollte tatsächlich um jedes Bit Speicher gekämpft werden.
Also hat ein EnumSet nicht eine Referenz pro Enum, sondern nur ein int? NiceEnums bestehen ja im Grunde auch nur aus ints. Und die Implementierung von EnumSet#contains() benutzt selbst Bitshifting auf diesen ints, also Enum#ordinal().