Double Braces Notation um Collections zu initialisieren

Status
Nicht offen für weitere Antworten.
M

maki

Gast
Bin gerade darüber gestolpert und wollte es mal hier reinstellen: Double Brace Initialization

Damit sind "einfachere" Initialisierungen von zB. Collections möglich:
Java:
public class Test {
	
	public static void main(String[] args) {
		List<String> list = new ArrayList<String>()  {{
			add("first");
			add("second");			
		}};
		
		for (String string : list) {
			System.out.println(string);
		}
	}

}

Man sollte vorsichtig damit umgehen, denn es wird eine anonyme innere Klasse erzeugt, was einerseits die Verwendung für final Klassen unmöglich macht, andererseits Probleme bei der equals Methode verursachen kann.
 

Ebenius

Top Contributor
Das ist ja hochgradig ekelig, dass es dafür einen Namen gibt der auch noch so irreführend ist. Hier handelt es sich um einen Initializer einer anonymen Klasse. Sowas ist durchaus gerechtfertigt; das obige Beispiel ist allerdings genau ein Fall in dem man keine Ableitung möchte.

Jetzt werd ich wieder das ganze Wochenende lang Albträume haben.

Ebenius
 
M

maki

Gast
Jetzt werd ich wieder das ganze Wochenende lang Albträume haben.
LOL ich schmeiss mich weg...

Dachte mir schon dass es einen Grund gibt warum es ein unbekanntes Feature ist... wir hatten hier mal Fragen ob man Collections nicht einfacher initialisieren kann, bin mir aber nicht sicher ob es nciht beim alten "nein" bleiben sollte.
 
S

SlaterB

Gast
und ist nicht mal besonders einfach, eine Zeile pro Element..

lieber
List<String> list = new ArrayList<String>();
Collections.addAll(list, "first", "second");
 

Ebenius

Top Contributor
Dachte mir schon dass es einen Grund gibt warum es ein unbekanntes Feature ist...
Ich benutze Initializers gelegentlich bei anonymen Ableitungen. Zum Beispiel in so einem Fall:
Java:
toolBar.add(new AbstractAction("ABC") {
  {
    // Initialize tool tip
    putValue(SHORT_DESCRIPTION, "Click here and be surprised");
  }

  @Override
  public void actionPerformed(ActionEvent e) {
    System.out.println("Booooooo!");
  }
});

Man sollte aber nicht wegen des Initializers eine Ableitung erzeugen. Sowas rächt sich -- besonders mit Collections -- auch ganz flink, wenn Serialisierung ins Spiel kommt.

wir hatten hier mal Fragen ob man Collections nicht einfacher initialisieren kann, bin mir aber nicht sicher ob es nciht beim alten "nein" bleiben sollte.
Es sollte! Wo ist denn obiger Quelltext einfacher als:
Java:
List<String> list = new ArrayList<String>(2);
add("first");
add("second");
Das obige Beispiel (mit Initializer) erzeugt mehr Aufwand zu Laufzeit (eine Ableitung mehr, tieferer Stack bei der Initialisierung), mehr Speicherbedarf (zusätzliches .class-File), mehr Zeilen (wenn man vernünftig formatiert), mehr Verwirrung.

Ebenius
 
Zuletzt bearbeitet:

0x7F800000

Top Contributor
@Ebenius:
Java:
Collections.addAll(Collection<T> c, T... t);
Kannte ich noch gar nicht. Hab leider immer noch zu viel Java 1.4-Quelltext vor den Augen.
Das ist zwar etwas besser als nichts, erlöst aber einen nicht vom problem, dass man eine temporäre variable anlegen muss, und nicht direkt eine Liste erzeugen kann, um sie als argument in irgeneiner methode zu verwenden. Da ist Arrays.asList(T... t) schon praktischer...

@maki:
sowas hätte ich von dir nicht erwartet^^ :D
Obwohl... ich interpretiere diesen Beitrag nicht als Vorschlag einer Alternative, sondern als Warnung nach dem Motto "Know Your Enemy", dann ist alles in Ordnung ;)

...wobei ich sagen muss: ganz unelegant ist der vorschlag in der tat nicht :reflect:
 

0x7F800000

Top Contributor
wie wär's denn mit sowas?
Java:
import java.util.*;

public class _ {
	
	//zum füllen der collections
	public static <T,C extends Collection<T>> C addAll(C c, T... t){
		for(T e:t) c.add(e);
		return c;
	}
	
	//zum befüllen der maps
	public static class MapFiller<K,V,M extends Map<K,V>>{
		private M map;
		public MapFiller(M m){
			map=m;
		}
		public MapFiller<K,V,M> put(K key, V value){
			map.put(key,value);
			return this;
		}
		public M endFill(){
			return map;
		}
	}
	
	public static <K,V,M extends Map<K,V>> MapFiller<K,V,M> beginFill(M m){
		return new MapFiller<K,V,M>(m);
	}
	
	public static void main(String[] args){
		
		//ist direkt als Argument einsetzbar, ohne hilfsvariablen
		System.out.println(addAll(new LinkedList<String>(),"a","b","c"));
		
		//ist typsicher, es geht keine information über den konkreten collection typ verloren
		LinkedList<String> list=addAll(new LinkedList<String>(),"a","b","c");

		//etwas umständlicher für maps:
		System.out.println(
			beginFill(new HashMap<Integer,String>())
				.put(2,"zwei")
				.put(3,"drei")
				.put(4,"vier")
				.put(7,"sieben")
			.endFill()
		);
		
		//hier geht auch keine information über typ verloren:
		HashMap<Integer,String> m=beginFill(new HashMap<Integer,String>())
			.put(2,"zwei")
			.put(3,"drei")
			.put(4,"vier")
			.put(7,"sieben")
		.endFill();
	}
}
Es erspart einem die Notwendigkeit, sich für temporäre Variablen irgendwelche Namen auszudenken, und durch diese ganzen Manipulationen verliert man nirgends was.
 

SchonWiederFred

Bekanntes Mitglied
Falls es eine unveränderliche Liste sein soll:
Java:
List<String> list = Arrays.asList("first", "second");
ansonsten:
Java:
List<String> list = new ArrayList<String>(Arrays.asList("first", "second"));
 
M

maki

Gast
@SlaterB
Ok, deine Variante ist besser :D

@Ebenius
Ok, speziell das Argument mit der Serialisierung ist ein Totschlagargument, hatte ich nicht bedacht.

@Andrey
naja, nicht unbedingt ein Vorschlag oder Warnung, mehr als Diskussionsgrundlage, habe sie heute auch zum ersten mal bewusst so wahrgenommen.

Könnte mich irren, aber ich denke das die Expectations mit JMock so aufgebaut werden, wobei dass bei diesem Anwendungsfall nicht nur vertretbar ist, sonern eine gue Sache.
Aber eben nicht für initialisierungen.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
JAnruVA Datentypen Berechneten String-Wert in Double umwandeln um weiter zu rechnen Allgemeine Java-Themen 7
Neumi5694 double Vergleich Allgemeine Java-Themen 19
G Modulo - double Allgemeine Java-Themen 21
ReinerCoder Eclipse Fehlermeldung - The constructor Double(double) is deprecated Allgemeine Java-Themen 8
O Variablen Addition von Double-Werten ergibt seltsame 0.9999999 Zahlen Allgemeine Java-Themen 2
B Long in einen Double umwandeln und im Label anzeigen Allgemeine Java-Themen 7
VfL_Freak Double mit zwei festen NK-Stellen ausgeben Allgemeine Java-Themen 9
B List<Integer> ist List<Double> ? Allgemeine Java-Themen 6
SkyScreamer Variablen Int umwande in Double/ 1 Miner = 5 Cookies/s Allgemeine Java-Themen 2
T Teile eines Double-Wertes verändern Allgemeine Java-Themen 2
T Double salted bcrypt Allgemeine Java-Themen 0
A Zahl abgerundet obwohl Double Allgemeine Java-Themen 9
R jTable, nur Werte zwischen 2 Double values ausgeben Allgemeine Java-Themen 3
Y String to Double ohne ParseDouble Allgemeine Java-Themen 11
D Double aus String auslesen Allgemeine Java-Themen 8
M double Array Allgemeine Java-Themen 8
P Wird double und float auf jedem Computer gleich berechnet? Allgemeine Java-Themen 10
C String in double[][] konvertieren! Allgemeine Java-Themen 5
M Cast double[]-->Object[] oder Vector<double[]> Allgemeine Java-Themen 3
Zettelkasten Double --> Integer Allgemeine Java-Themen 4
M float, double, BigDecimal Allgemeine Java-Themen 5
S Variablen Prüfen ob Number vom Typ Integer, Float, Double, ... ist Allgemeine Java-Themen 2
J String mit "," in Double Wert konvertieren Allgemeine Java-Themen 7
R Eclipse Verschiedene Ergebnisse bei Berechnung eines double-Werts Allgemeine Java-Themen 5
B Variablen Bug of Float. & Double.MIN_VALUE! Allgemeine Java-Themen 4
T ArrayList<double[]> persitent anlegen Allgemeine Java-Themen 7
K double Zufallszahl Allgemeine Java-Themen 6
S String in Double - letztes Zeichen fehlt Allgemeine Java-Themen 4
T int <-> integer, double <-> Double... Allgemeine Java-Themen 2
J Umstellung von double auf BigDecimal Allgemeine Java-Themen 5
H2SO3- String 1.000,00 in double umwandeln Allgemeine Java-Themen 12
S Double-Checked Locking Allgemeine Java-Themen 4
I 2D-Grafik Polygon mit Double Werten zeichnen Allgemeine Java-Themen 4
M FIFO Queue: bytes in, float/double/etc out Allgemeine Java-Themen 5
H double dispatch und equals(Object) Allgemeine Java-Themen 6
vandread Float/Double probleme bei der Multiplikation?! Allgemeine Java-Themen 3
J Casting Problem Object, Double und String Allgemeine Java-Themen 3
F double auf 2 Nachkommastellen runden Allgemeine Java-Themen 9
D Double to Integer - ist das möglich? Allgemeine Java-Themen 3
T Object auf Double, Int, String testen Allgemeine Java-Themen 5
H2SO3- großen double in string mit e umwandeln Allgemeine Java-Themen 4
T Problem: Double als Geldbetrag - Rundungsfehler Allgemeine Java-Themen 5
P große double Zahlen und modulo Allgemeine Java-Themen 8
G Double Wert über OutputStream verschicken Allgemeine Java-Themen 2
M größer als double? Allgemeine Java-Themen 4
N Double ohne Wissenschaftliche Schreibweiße Allgemeine Java-Themen 5
R Eigene ArrayList vom Typ Short, Integer oder Double Allgemeine Java-Themen 4
R Double Werte aus byte[] auslesen Allgemeine Java-Themen 5
T XStream.toXML => double mit , anstelle . Allgemeine Java-Themen 3
G Fehler bei Array.getDouble mit Double[] als Argument! Allgemeine Java-Themen 6
A Problem bei Übergabe von Werten in ein double Array. Allgemeine Java-Themen 21
M Double immer mit 2 Kommastellen Allgemeine Java-Themen 3
G double in Date Allgemeine Java-Themen 5
reibi double-Wert auf 2 Stellen nach dem Komma abschneiden Allgemeine Java-Themen 6
G Genauigkeit von Double Allgemeine Java-Themen 2
F Double mit Streams aus Datei einlesen Allgemeine Java-Themen 3
V "double in Exponentialschreibweise" normal ausgebe Allgemeine Java-Themen 2
S List<Double> oder Double[] in double[] zu konvertieren Allgemeine Java-Themen 6
C casten vom Typ Object nach Double[][] Allgemeine Java-Themen 2
E int vs. float vs. double Allgemeine Java-Themen 7
T cast Object to Double[] Allgemeine Java-Themen 2
DEvent double von c nach Java Allgemeine Java-Themen 4
K Double-Zahl runden Allgemeine Java-Themen 4
J double 3.0 soll ohne Nachkommastelle ausgegeben werden Allgemeine Java-Themen 12
S Java Double addieren Allgemeine Java-Themen 3
A string zu double Allgemeine Java-Themen 3
T double to object Allgemeine Java-Themen 3
J Große Zahl (double) as text ausgeben? Allgemeine Java-Themen 2
G Verständnisproblem double und float Allgemeine Java-Themen 7
padde479 String in double parsen Allgemeine Java-Themen 6
E double auf int runden, nicht abschneiden Allgemeine Java-Themen 2
G Double Zahl quadrieren Allgemeine Java-Themen 8
C double Zahlen mit drei NachkommaStellen in String umwandeln Allgemeine Java-Themen 2
T Nachkommastellen double Allgemeine Java-Themen 18
M double aufrunden Allgemeine Java-Themen 6
W Division mit float und double Allgemeine Java-Themen 2
D JTextfield für double werte Allgemeine Java-Themen 2
S Format von Double Allgemeine Java-Themen 9
F Umwandlungsproblem mit double Allgemeine Java-Themen 2
S Problem! Lösung mit Double buffering Allgemeine Java-Themen 3
T Vector <-> double Allgemeine Java-Themen 4
W float/double verhält sich seltsam Allgemeine Java-Themen 6
D Double: Grenzen und Darstellung Allgemeine Java-Themen 7
W String to Double (landesspezifisch) Allgemeine Java-Themen 14
T Fließkomma (double) richtig runden Allgemeine Java-Themen 7
P Class zu Integer, String, Double etc. Allgemeine Java-Themen 11
R Fehler in WindowsXP oder Java? - double in int konvertieren Allgemeine Java-Themen 10
E NumberFormatException bei cast auf double Allgemeine Java-Themen 5
D Wann ist das ergebnis einer Rechnung eine Double? Allgemeine Java-Themen 7
G Double Zahl auf 4 Stellen hinter Komma kuerzen Allgemeine Java-Themen 4
G warum operator || cannot be applied to int, double Allgemeine Java-Themen 11
A Probleme Umwandlung Ausdruck String in double Allgemeine Java-Themen 4
B Double-Wert aus einem HexString erstellen. Allgemeine Java-Themen 11
R Double Buffering zu langsam Allgemeine Java-Themen 11
C Bug in Java1.4.2_03 mit double Allgemeine Java-Themen 5
H Double mit 2 Nachkommastellen speichern. Allgemeine Java-Themen 5
C Double zu Hex oder Byte Allgemeine Java-Themen 4
H float Berechnung: Ergebnis ohne wissenschaftliche Notation Allgemeine Java-Themen 5
Ark O-Notation und Zahl versus String-Repräsentation Allgemeine Java-Themen 7
R Entfernen der '..' Notation aus dem Pfad Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben