WCM - Das österreichische Computer Magazin Forenübersicht
 

Zurück   WCM Forum > Rat & Tat > Programmierung

Programmierung Rat & Tat für Programmierer

Microsoft KARRIERECAMPUS

Antwort
 
Themen-Optionen Ansicht
Alt 12.11.2003, 23:16   #1
1st Baseman
Veteran
 
Registriert seit: 11.03.2001
Alter: 48
Beiträge: 327


Standard 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!
1st Baseman ist offline   Mit Zitat antworten
Alt 13.11.2003, 00:59   #2
Who-T
Elite
 
Registriert seit: 01.08.2000
Beiträge: 1.395


Who-T eine Nachricht über ICQ schicken
Standard 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);
____________________________________
Whoever built humanity left in a major design flaw: it was the tendency to bend at the knees.
Who-T ist offline   Mit Zitat antworten
Alt 13.11.2003, 09:39   #3
1st Baseman
Veteran
 
Registriert seit: 11.03.2001
Alter: 48
Beiträge: 327


Reden

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.
1st Baseman ist offline   Mit Zitat antworten
Alt 13.11.2003, 10:38   #4
Flink
Hero
 
Registriert seit: 29.08.2001
Alter: 57
Beiträge: 904


Flink eine Nachricht über ICQ schicken Flink eine Nachricht über Skype™ schicken
Standard 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.
____________________________________
Bibel
Flink ist offline   Mit Zitat antworten
Alt 13.11.2003, 11:08   #5
Hannes0815
Senior Member
 
Registriert seit: 08.07.2003
Alter: 44
Beiträge: 131


Hannes0815 eine Nachricht über ICQ schicken
Standard

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?
Hannes0815 ist offline   Mit Zitat antworten
Alt 13.11.2003, 12:07   #6
Who-T
Elite
 
Registriert seit: 01.08.2000
Beiträge: 1.395


Who-T eine Nachricht über ICQ schicken
Standard

@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
____________________________________
Whoever built humanity left in a major design flaw: it was the tendency to bend at the knees.
Who-T ist offline   Mit Zitat antworten
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.

Gehe zu


Alle Zeitangaben in WEZ +2. Es ist jetzt 16:04 Uhr.


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