# verschiedene datentypen in arraylist



## Guest (14. Aug 2007)

hallo, ist es möglich in eine aryaylist verschiedene datentypen, zu packen, also einen int wert einen boolwert,einen String und ein objekt einer eigens erstellten Klasse bsp. person .
und wie muss ich das machen kann ich einfach sagen new arralist und dann mit add die einzelnen hinzufügen.


----------



## MarcoBehnke (14. Aug 2007)

Ja, nur dass Du keine nativen Datentype (int, float etc...) darein packen kannst. Dazu musst du die Wrapper klassen Integer, Floar, Boolean etc benutzen.


```
ArrayList list = new ArrayList();
list.add(new Object());
list.add(new Integer(5));
// etc....
```

Beim rausholen aus der ArrayList und der Weiterverwendung musst Du allerdings genau darauf achten, was Du machst.


----------



## Gast (14. Aug 2007)

Ja ok danke für die schnelle Antwort. Wollte halt eine Arraylist verwenden um nicht 10 parameter einzeln übergeben zu müssen. da es aber immer diese parameter sind sollte es ja kein problem sein oder?


----------



## jPat (14. Aug 2007)

Ja, dass kannst du machen, du weisst dann abver nicht, wo welcher datentyp sich befindet.

BSP:


```
ArrayList al = new ArrayList();
al.add(new Integer(5));
al.add("Hallo");

Integer i =  (Integer) al.get(0);  // Hier gibt es ein Warning, da der COmpiler nicht weiß ob dort ein Integer drin ist.  
String  s =  (String) al.get(1);    // s.o.
```

Hinweis:  instaceof - operator !    

primitive Datentypen wie int, double, ... kannst du nicht reinspeichern. Siehe Wrapper Klassen -> Javabuch


----------



## Gast (14. Aug 2007)

ok danke für die tipps und hinweise


----------



## milchjeeper (14. Aug 2007)

hu,

wenn du dir nicht merken willst welcher typ an welcher stelle steht kannst du die Art des Objekts auch abfragen:


```
for(int i=0; i < a.size(); i++)
		{
			if( a.get(i) instanceof Integer )
			{
				// machwas
			}
			// (...)
		}
```



Gruß

milchjeeper


----------



## SlaterB (14. Aug 2007)

Strings schonmal gar nicht mit == vergleichen, sondern mit equals,
und Klassen doch wohl mit instanceof testen!


----------



## Marco13 (14. Aug 2007)

Mal ganz allgemein: Nicht alles, was man tun KANN, SOLLTE man auch tun. Was auch immer du erreichen willst: Wenn du glaubst, dass eine ArrayList mit verschiedenen Typen die beste Lösung ist, kannst du davon ausgehen, dass du dich irrst....


----------



## Leroy42 (14. Aug 2007)

Gast hat gesagt.:
			
		

> um nicht 10 parameter einzeln übergeben zu müssen.



Warum definierst du dir nicht einfach eine eigene Klasse dafür?


```
class MyData {
  int param1;
  int param2;
  String param3;
  String param4;
  MyClass param5;
  ...
}
```


----------



## MarcoBehnke (14. Aug 2007)

also... eine ArrayList zu benutzen, um Parameter an eine Funktion zu übergeben ist "schlechter Stil"

Wenn die Funktion viele Parameter hat, dann mag das zwar auf den ersten Blick unübersichtlich sein, aber dafür ist es klar definiert und jeder der die Funktion sieht, weiß sofort, was da übergeben wird (Stichwort Wartbarkeit).

Eine Klasse mit vielen Variablen zur Übergabe als Parameter verlagert nur das Problem, schlechter Stil bleibt es trotzdem.


----------



## Leroy42 (14. Aug 2007)

MarcoBehnke hat gesagt.:
			
		

> Eine Klasse mit vielen Variablen zur Übergabe als Parameter verlagert nur das Problem, schlechter Stil bleibt es trotzdem.



Wieso das denn?  :shock: 

Auf diese Art werden die _Parameter_ logisch
zusammengefasst.


----------



## Wildcard (14. Aug 2007)

Leroy42 hat gesagt.:
			
		

> MarcoBehnke hat gesagt.:
> 
> 
> 
> ...


Design Pattern Parameter Object
http://c2.com/cgi/wiki?ParameterObject


----------



## Leroy42 (14. Aug 2007)

Wildcard hat gesagt.:
			
		

> Leroy42 hat gesagt.:
> 
> 
> 
> ...





			
				Zitat aus obigem Link hat gesagt.:
			
		

> _Proposed Solution: Replace the LongParameterList with a ParameterObject;
> an object or structure with data members representing the arguments to be passed in._



Da wird das doch auch vorgeschlagen.
Oder bin ich jetzt zu blöd die Passage zu finden,
in der diese Vorgehensweise kritisiert wird?  :shock:   ???:L


----------



## MarcoBehnke (14. Aug 2007)

ne, das war als Support für Dich gedacht und gegenüber diesem Designpattern muss ich mich wohl geschlagen geben


----------



## Wildcard (14. Aug 2007)

MarcoBehnke hat gesagt.:
			
		

> gegenüber diesem Designpattern muss ich mich wohl geschlagen geben


Was heißt geschlagen geben? Dieses Vorgehen macht dennoch nur Sinn, wenn man sich auch an andere Prinzipien hält.
Dazu sei folgender 'Smell within a class' zitiert:



> Long Parameter List
> Don't pass in everything the method needs; pass in enough so that the method can get to everything it needs.


http://wiki.java.net/bin/view/People/SmellsToRefactorings


----------

