# Arraylist.contains(Klasse) möglich?



## Blakh (14. Jun 2010)

Hallo,

habe eine simple Frage, wo ich mit google nicht weitergekommen bin. Ist es möglich zu schauen ob in einer Arraylist verschiedener Objekte eine bestimmte Klasse enthalten ist?

Eclipse meldet zumindestens in dem Editor keinen Fehler:


```
eineArrayList.contains(EineKlasse.class)
```

Kann Programm nicht testen gerade, da noch einige rote Kreuze da sind .

Grüße


----------



## SlaterB (14. Jun 2010)

dann teste doch ein neues separates Programm, das ist sowieso immer besser für Einzelfragen


----------



## Michael... (14. Jun 2010)

Komplier- und ausführbar ist das schon. Aber bist Du Dir sicher, dass das macht was Du willst? Bzw. was willst Du damit machen?


----------



## XHelp (14. Jun 2010)

Ich glaube nicht, dass das geht. Optional kannst du ja die ArrayList um containsClass(Class classToCheck) erweitern.


----------



## Gastredner (14. Jun 2010)

So wir von dir gedacht geht es nicht - du müsstest wenn schon selbst eine Methode schreiben, die über die Liste iteriert und dabei nach Instanzen deiner Klasse sucht:

```
public static boolean containsClass(List<?> list, Class<?> clazz) {
	return countClassInstances > 0;
}

public static int countClassInstances(List<?> list, Class<?> clazz) {
	int count = 0;
	for (Object o: list) {
		if (o.getClass().equals(clazz)) {
			count++;
		}
	}
	return count;
}
```


----------



## Gelöschtes Mitglied 5909 (14. Jun 2010)

> [...]ob in einer Arraylist verschiedener Objekte [..]



Wieso machst du sowas? Nehm lieber zwei Listen oder löse es anders



> Optional kannst du ja die ArrayList um containsClass(Class classToCheck) erweitern.



auch ne schlechte idee. lieber ne utility klasse verwenden was Gastredner schon gepostet hat


----------



## XHelp (14. Jun 2010)

raiL hat gesagt.:


> auch ne schlechte idee. lieber ne utility klasse verwenden was Gastredner schon gepostet hat



Ok, macht Sinn. Aber warum? Wegen Erweiterbarkeit/Modularität oder gibt es da andere Gründe?


----------



## SlaterB (14. Jun 2010)

so wie Collections.sort() sollte das für alle Listen gehen, 'gegen das Interface programmieren',
dass das der Objektoriertung im Sinne von 'Methoden in die Klassen' widerspricht, ist gewiss ein offenkundiger Punkt


----------



## Marco13 (14. Jun 2010)

Tendenziell sollte man mit dem Erben ... zurückhaltend sein. Es ist auf jeden Fall NICHT sinnvoll, eine Funktion, die man halt gerade mal braucht, mal kurz in eine Vererbungshierarchie reinzuwursten. Wie genau würde das aussehen?

```
class ArrayListWithClassContains<T> extends ArrayList<T>
{
    // hier die contains-methode...
}
```

Dann noch eine LinkedListWithClassContains, und einen VectorWithClassContains, und eine CopyOnWriteArrayListWithClassContains...? :autsch:

In diesem Fall ist eine statische utility-Methode vieeel universeller:

```
public static boolean containsClass(Iterable<?> iterable, Class<?> c)
{
    for (Object object : iterable)
    {
        if (object.getClass().equals(c))
        {
            return true;
        }
    }
    return false;
}
```
Das funktioniert (wenn man es getestet hat, was ich jetzt nicht habe  ) überall und immer, mit ArrayList, LinkedList, Set oder sonstwas, und man schleppt nicht überall seine ganz spezielle "ListWithClassContains"-Klasse mit sich rum.

Die Frage: http://www.java-forum.org/allgemein...embermethoden-statische-utility-methoden.html ist aber schon ganz interessant...


----------



## Blakh (15. Jun 2010)

Werds mir morgen mal zu gemüte führen. Wieso ich das amchen will? Naja ich möchtevon einem anderen Thread was erzeugt haben. Dies sind unterschiedliche Klassen, je nachdem was für eine Nachricht ich erhalten habe, muss eine entsprechende Klasse gebildet werden. Diese sind alles extended Klassen einer einzigen und ich möchte dann vom Verbraucher-Thread nach einer bestimmten Klasse darin suchen, möglichst schnell.


----------



## Blakh (15. Jun 2010)

raiL hat gesagt.:


> Wieso machst du sowas? Nehm lieber zwei Listen oder löse es anders



Tja .... wenn es eine andere Lösung gebe  ... mir fällt nix ein. Und es sind ca. 30 Klassen. Soll ich 30 Listen machen? 

Ansonsten danke euch. Ich bau also mir eine Utility-Klasse.


----------



## Michael... (15. Jun 2010)

Wenn man genauer wüsste was Du vorhast, gäbe es bestimmt eine schönere Lösung...


----------



## Blakh (15. Jun 2010)

Ok nochmal, wie du anhand meiner anderen Threads im Forum bemerkt hast, baue ich einen kleinen Client. Es handelt sich um ein Client zum Senden und Empfangen von Voice per RTP und parallel ASN1 Nachrichten, welche für das Signaling zuständig sind. Wenn ich jetzt z.B. einen Call machen möchte, dann sende ich eine bestimmte ASN1 Nachricht und muss auf eine bestimmte Antwort warten (jede Nachricht ist eine eigene Klasse z.B. ASN1CallStart extended von der Klasse ASN1Typ). Solang geht der Callhandler-Thread in den Wartezustand für eine maximale Zeit bis er abbricht. Ich habe ein Listener, welcher auf einem Port lauscht und die Nachrichten anhand der Tags verteilt und diese eben in eine Liste vom CallHandler schiebt und diesen weckt oder einen neuen CallHandle-Thread startet. Es kann aber jederzeit vorkommen, dass der Server eine andere Nachricht z.B. ASN1CallIncoming sendet, wo der CallHandler auch gefragt ist. Ich dachte, dass eine Liste besser ist als für jede Klasse eine extra Liste zu machen, da es durchaus viele verschiedene Klassen sind.

Das mit dem Call ist nur ein Beispiel. Gibt noch andere Sachen wie Connection-Status etc.


----------



## faetzminator (15. Jun 2010)

Warum machst du in der Basisklasse nicht einfach ein Feld (Enum o.ä.), in welchem der Typ auslesbar ist?


----------



## Blakh (15. Jun 2010)

Die Basisklasse ist Teil einer Library. Da kann ich nicht ran. Jemand eine Idee wie ich dem Handler die Nachrichten-Klassen am Besten übergebe? Die Nachrichten sind alle anhand ihrer ASN1 Tags identifizierbar.


----------



## Michael... (15. Jun 2010)

Blakh hat gesagt.:


> Die Basisklasse ist Teil einer Library. Da kann ich nicht ran.


Kannst Sie ja per Vererbung erweitern.

Was ich jetzt noch nicht verstanden habe: Warum willst/musst Du per "contains" bzw. einem Hilfskonstrukt überprüfen, ob ein Objekt vom Typ einer bestimmten Klasse in der Liste enthalten ist?


----------



## Blakh (15. Jun 2010)

Nachdem der Thread nach einer maximalen Zeit aufgewacht ist, muss er ja schauen ob die benötigte Antwort eingetroffen ist und mit der Klasse weiter hantieren. Da stehe ich eben auf dem Schlauch. 

Ich poste mal den Code... bin da noch am rumschrauben. Hoffe, dass das mit dem synchronized so stimmt, wie ich es verstanden habe . Die Listener-Klasse ist auch in Arbeit und wird noch umbenannt, da dort über diese auch das Senden berwerkstelligt wird. 


```
private static ArrayList<ASN1Type> inCmd;


public static String connect() {

    ...

    Listener.getInstance().sendCommand(new ATClientCreate(client.getClientId()
				.getBytes()).getTagged());

		
    synchronized( inCmd ) 
    { 
        try { 
            inCmd.wait(3000); 
            // Habe gewartet, kann jetzt loslegen. 
        } catch ( InterruptedException e ) { 
            ....
        } 

         if ( inCmd.isEmpty() || !inCmd.contains(ATClientAuthRequest.class)) { // <-- Hier die Stelle
				//TODO : Fehlermeldung schön machen
			
            result = "Failed to make the connection bla!";
            return result;
				
        } else  {
            ... nächste Nachricht ....
        }
    ...
    }
}
```


----------



## Michael... (15. Jun 2010)

So ganz habe ich das Konzept noch nicht verstanden. Hast Du da so eine Art Nachrichtenqueue?
Kann man für solche "kritischen" Antworten nicht eine eigene Liste/ Queue verwenden oder einen Marker setzten, an dem der Thread erkennt, ob die Antwort eingegangen ist?


----------



## Blakh (15. Jun 2010)

Ich geb auf ;( . Ich glaub ich hab mich beim Design verrannt.


----------



## Gelöschtes Mitglied 5909 (15. Jun 2010)

Nicht aufgeben, das ist der einfachste weg. Überleg dir lieber genauer wie du das Design machst. Nicht immer gleich anfangen zu coden


----------

