Interfaces - Methoden-Typen ?

Hallo,

ich habe eine Frage an die Profis. Mein Ziel ist es, einen „Parser“ zu programmieren, der z.B. einen bestimmten „Input“ mit unterschiedlich parsen kann. (Z.B. ist der Input irgend ein Text und je nach ANwendugnszweck extrahiert dieser z.B. die Substantive oder Zahlen bzw was auch immer.

Ich wollte das eigentlich über ein Interface machen:

InterfaceParser {
public String parse (InterfaceDTO dataTransferObject);
}

das ich dann jeweils implementiere:
MyTextParser implements InterfaceParser
MyZalenParser implements InterfaceParser

Mein Problem ist nun das Übergeben der DTOs mit den Inhalten an die Parse Methode. Das sind einmal z.B. ein „DateiDTO“ einemal ein HTTPDTO etc, also gänzlich unterschiedliche Objecte die nur aus getter und setter Methoden bestehen. Diese implementieren das Interface InterfaceDTO.

Mag sein, dass ich das total falsch liege, kann das wirklich sein, dass ich dann wenn ich den Parser implementiere dann immer in den Parse Methoden erst die übergebenen InterfaceDTO Typen in die entsprechenden „echten“ Typen typecasten muss. Gibt es da nicht eine Typsichere Methode?

So muss es wohl sein?
MyTextParser implements InterfaceParser {

public parse(InterfaceDTO myFileDTO) {
FileDTO fileDTO = (FileDTO) myFileDTO

}

}

Warum geht folgendes nicht (das liefert einen Fehler in Eclipse)?
MyTextParser implements InterfaceParser {

public parse(FileDTO myFileDTO) {
und dann direkt weitearbeiten mit myFileDTO

}

}
FileDTO implementiert ja auch InterfaceDTO und ich dachte immer, dass ich dann wie oben geschriebe direkt in den Methodenparametern das konkrete Object verwenden (Und nicht das INteraface das ich typecasten muss).

Ich hoffe jemand versteht die Frage. Bin sehr dankbar für eine Antwort wie man dieses Problem löst.

Vielen DAnk und viele Grüße
Julian

Hallo Julian,

der Weg ist doch schon richtig.
Es scheint wohl bei Dir so zu sein, dass bestimmte Parser nur für bestimmte DTO Implementierungen zuständig sind.
Schreib Dir doch einfach eine Factory, die du nach einem Parser für eine DTO Instanz fragst. Diese Factory kennt dann alle DTOs und gibt den korrekten Parser zurück.
Damit kannst Du dann sicherstellen, dass Dein Parser auch das entsprechend casten kann.

Evtl. musst du mal darüber nachdenken, was die minimale Schnittstelle für einen beliebigen Parser auf ein DTO ist, um die Aufgaben zu erfüllen. Diese Schnittstelle sollten dann alle DTOs erfüllen, die Du in deinen Parser übergibts.

Dann fällt mir noch ein, dass das eigentliche Problem evtl. das Lesen der Daten aus einer DTO in einer für beliebige Parser geeigneten Form ist. D.h. du kannst Dir eine Art Adapter für das Lesen aus einer DTO für einen Parser bauen. Dieser Adapter kann für den Parser durch ein Interface beschrieben werden. Die konkrete Implementierung unterscheidet sich dann für jede DTO.

Hallo,

ich habe eine Frage an die Profis. Mein Ziel ist es, einen
„Parser“ zu programmieren, der z.B. einen bestimmten „Input“
mit unterschiedlich parsen kann. (Z.B. ist der Input irgend
ein Text und je nach ANwendugnszweck extrahiert dieser z.B.
die Substantive oder Zahlen bzw was auch immer.

Ich wollte das eigentlich über ein Interface machen:

InterfaceParser {
public String parse (InterfaceDTO dataTransferObject);
}

das ich dann jeweils implementiere:
MyTextParser implements InterfaceParser
MyZalenParser implements InterfaceParser

Mein Problem ist nun das Übergeben der DTOs mit den Inhalten
an die Parse Methode. Das sind einmal z.B. ein „DateiDTO“
einemal ein HTTPDTO etc, also gänzlich unterschiedliche
Objecte die nur aus getter und setter Methoden bestehen. Diese
implementieren das Interface InterfaceDTO.

Mag sein, dass ich das total falsch liege, kann das wirklich
sein, dass ich dann wenn ich den Parser implementiere dann
immer in den Parse Methoden erst die übergebenen InterfaceDTO
Typen in die entsprechenden „echten“ Typen typecasten muss.
Gibt es da nicht eine Typsichere Methode?

So muss es wohl sein?
MyTextParser implements InterfaceParser {

public parse(InterfaceDTO myFileDTO) {
FileDTO fileDTO = (FileDTO) myFileDTO

}

}

Warum geht folgendes nicht (das liefert einen Fehler in
Eclipse)?
MyTextParser implements InterfaceParser {

public parse(FileDTO myFileDTO) {
und dann direkt weitearbeiten mit myFileDTO

}

}
FileDTO implementiert ja auch InterfaceDTO und ich dachte
immer, dass ich dann wie oben geschriebe direkt in den
Methodenparametern das konkrete Object verwenden (Und nicht
das INteraface das ich typecasten muss).

In einem Interface beschreibst Du nur die Methoden-Signatur. In MyTextParser musst Du nun aber die Methode parse(InterfacerDTO …) implementieren. Was Du machen willst geht so in Java nicht (versuche einfache obige Ideen mal auszuprobieren).
Entwerfe eine Adapter-Interface InterfaceParserDTO für das Lesen von Daten aus eine InterfaceDTO. Für FileDTO muss eine Klasse ParserAdapterFileDTO das Inteface InterfaceParserDTO implementieren.

Dein Parser hat dann das Interface
interface InterfaceParser {
public String parse(InterfaceDTO dto, InterfaceParserDTO adapter);
}

Eine Implementierung dieser Schnittstelle würde nun Methode von adapter benutzen um aus dto zu lesen.

Ich hoffe jemand versteht die Frage. Bin sehr dankbar für eine
Antwort wie man dieses Problem löst.

Vielen DAnk und viele Grüße
Julian

Hoffe geholfen zu haben,
Frank

Danke
Hallo Frank,

vielen Dank für die ausführliche Antwort!

Viele Grüße
Julian