WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Programmierung (http://www.wcm.at/forum/forumdisplay.php?f=17)
-   -   Java Problemchen (http://www.wcm.at/forum/showthread.php?t=115332)

1st Baseman 12.11.2003 23:16

Java Problemchen
 
Hi wieder mal!

Ich arbeite nach wie vor an einem Java Client für Amazon web Services (hatte da schon mal ein Problem gepostet).
Ich habe jetzt ein kleines Problem, hier ein Ausschnitt aus meinem Programm:

Code:

String directive = args[0];

Object searchObject;

if (directive.equals("actor")) {
  searchObject = new ActorSoap();
} else if (directive.equals("artist")) {
  searchObject = new ArtistSoap();
} else if (directive.equals("asin")) {
  searchObject = new AsinSoap();
} else if ...
} else {
  showUsage();
}

searchObject.setParameter("Dev-Tag",DEVTOKEN);
searchObject.setParameter("Mode","books");
searchObject.setParameter("Keyword",keyword);

Die Art der Suche wird beim Programmstart als Parameter übergeben (args[0]). Je nachdem soll dann das Object searchObject aus der entsprechenden Klasse instanziiert werden. Die Methode setParameter() ist in allen Klassen definiert.

Allerdings bekomme ich beim Versuch, das Programm zu kompilieren, immer die Fehlermeldung

Zitat:

FirstClient.java:58: cannot resolve symbol
symbol : method setParameter (java.lang.String,java.lang.String)
location: class java.lang.Object
searchObject.setParameter("Dev-Tag",DEVTOKEN);
Scheinbar wird in der Klasse Object nach der Methode gesucht, wo sie natürlich nicht gefunden wird...

Wenn ich die Zeile

Object searchObject;

rauslösche, und den Rest so abändere

Code:

String directive = args[0];
String keyword = args[1];

if (directive.equals("actor")) {
  ActorSoap searchObject = new ActorSoap();
} else if (directive.equals("artist")) {
  ArtistSoap searchObject = new ArtistSoap();
} else if (directive.equals("asin")) {
  AsinSoap searchObject = new AsinSoap();
} else if ...
} else {
  showUsage();
}

searchObject.setParameter("Dev-Tag",DEVTOKEN);
searchObject.setParameter("Mode","books");
searchObject.setParameter("Keyword",keyword);

funktioniert's leider auch nicht, da die Objekte wohl nur in dem if-Block gültig sind, in dem sie definiert werden (oder?)

Zitat:

FirstClient.java:58: cannot resolve symbol
symbol : variable searchObject
location: class FirstClient
searchObject.setParameter("Dev-Tag",DEVTOKEN);
Ich hoffe, ich habe das Problem verständlich erklärt.
Wahrscheinlich ist die Lösung eh simpel, aber ich bin leider nicht sehr Java-erfahren und deshalb für jede Hilfe dankbar! :)

Who-T 13.11.2003 00:59

Re: Java Problemchen
 
es geht auf zwei arten

Code:

String directive = args[0];

Object searchObject;

if (directive.equals("actor")) {
  searchObject = new ActorSoap();
  ((ActorSoap)searchObject).setParameter("Dev-Tag",DEVTOKEN);
  ((ActorSoap)searchObject).setParameter("Mode","books");
  ((ActorSoap)searchObject).setParameter("Keyword",keyword);
} else if (directive.equals("artist")) {
  searchObject = new ArtistSoap();
  ((ArtistSoap)searchObject).setParameter("Dev-Tag",DEVTOKEN);
  ((ArtistSoap)searchObject).setParameter("Mode","books");
  ((ArtistSoap)searchObject).setParameter("Keyword",keyword);
} else if (directive.equals("asin")) {
  searchObject = new AsinSoap();
  ((AsinSoap)searchObject).setParameter("Dev-Tag",DEVTOKEN);
  ((AsinSoap)searchObject).setParameter("Mode","books");
  ((AsinSoap)searchObject).setParameter("Keyword",keyword);
} else if ...
} else {
  showUsage();
}

das is die nicht so schöne art

schöner wärs wenn du eine (vielleicht abstrake) oberklasse (bzw auch interface) soap hast, die die methode setparameter definiert
alle *Soap sind dann extends Soap (bzw implements Soap)


dann gehts mit

Code:

String directive = args[0];

Object searchObject;

if (directive.equals("actor")) {
  searchObject = new ActorSoap();
} else if (directive.equals("artist")) {
  searchObject = new ArtistSoap();
} else if (directive.equals("asin")) {
  searchObject = new AsinSoap();
} else if ...
} else {
  showUsage();
}

((Soap)searchObject).setParameter("Dev-Tag",DEVTOKEN);
((Soap)searchObject).setParameter("Mode","books");
((Soap)searchObject).setParameter("Keyword",keyword);


1st Baseman 13.11.2003 09:39

Vielen Dank!

Die Klassenstruktur ist glücklicherweise eh so, wie von dir vorgeschlagen: Es gibt ein Interface SoapQuery, dieses wird von AbstractSoapQuery implementiert, und die einzelnen Suchmodus-Klassen sind wiederum Subklassen von AbstractSoapQuery!

Ich werd also die zweite Variante probieren.

Flink 13.11.2003 10:38

Interface
 
Dies ist ein klassischer Fall für die Verwendung von Interfaces:

Code:

public interface SoapInt
{
  public int setParameter(String name1, String name2);
}

class ActorSoap implements SoapInt
{
...
}

class ArtistSoap implements SoapInt
{
...
}

class AsinSoap implements SoapInt
{
...
}



String directive = args[0];

SoapInt searchObject;

if (directive.equals("actor")) {
  searchObject = new ActorSoap();
} else if (directive.equals("artist")) {
  searchObject = new ArtistSoap();
} else if (directive.equals("asin")) {
  searchObject = new AsinSoap();
} else if ...
} else {
  showUsage();
}

searchObject.setParameter("Dev-Tag",DEVTOKEN);
searchObject.setParameter("Mode","books");
searchObject.setParameter("Keyword",keyword);

Als Java-Programmierer sollte man keinen Cast-Operator mehr verwenden.

Hannes0815 13.11.2003 11:08

Bin zwar Java Newbie, aber für mich heisst die oberste Fehlermeldung das die Methode
setParameter() 2 Strings erwartet und das ist bei searchObject.setParameter("Dev-Tag",DEVTOKEN); nicht der Fall :)

Zitat:

FirstClient.java:58: cannot resolve symbol
symbol : method setParameter (java.lang.String,java.lang.String)
location: class java.lang.Object
searchObject.setParameter("Dev-Tag",DEVTOKEN);
Ist das möglich?

Who-T 13.11.2003 12:07

@hannes
final String DEVTOKEN = "devtoken";

und schon wärs erlaubt.

@fink
ja, stimmt. dreimaliges casten is net das gelbe vom ei. fällt mir auch grad auf.

ganz vermeiden wirst den cast operator aber nur selten können


Alle Zeitangaben in WEZ +2. Es ist jetzt 10:07 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag