Arraylist.contains(Klasse) möglich?

Blakh

Bekanntes Mitglied
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:

Java:
eineArrayList.contains(EineKlasse.class)

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

Grüße 🙂
 
dann teste doch ein neues separates Programm, das ist sowieso immer besser für Einzelfragen
 
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:
Java:
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;
}
 
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
 
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?
Code:
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:
Java:
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...
 
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.
 
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.
 
Zuletzt bearbeitet:
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.
 
Zuletzt bearbeitet:
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.

Java:
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 ....
        }
    ...
    }
}
 
Zuletzt bearbeitet:
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?
 
Nicht aufgeben, das ist der einfachste weg. Überleg dir lieber genauer wie du das Design machst. Nicht immer gleich anfangen zu coden 🙂
 

Neue Themen


Zurück
Oben