Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
class A
{
...
String IPAdress ="";
String PORT = "";
String clientID = "";
C myC = new C();
myC.getSettings();
}
class B
{
...
String IPAdress ="";
String PORT = "";
String clientID = "";
C myC = new C();
myC.getSettings();
}
class C
{
...
public void getSettings()
{
String IPAdress = "127.0.0.1";
String PORT = "10";
String clientID = "44";
// aufrufendeKlasse.IPAdress = IPAdress;
}
}
In Klasse C gibt es eine Methode die die Werte dreier Felder bestimmt.
Diese Methode aus Klasse C kann nun von Klasse A oder B aufgerufen werden.
Wie bekomme ich das nun hin daß ich die Felder der aufrufenden Klasse in der Methode getSettings ändern kann?
Vielen Dank.
1. Bitte gewöhn dir gleich an: Variablen grundsätzlich klein!!!! (Konstanten u.a mal ausgenommen),
2. Und "sprechende" Namen sind meist von Vorteil
3. Warum gibt es eine Klasse B, die genauso aussieht wie die Klasse A? Damit sowas nicht vorkommt, gibt es OO!
Ansonsten kannst du das dein Problem folgendermaßen lösen:
Java:
class A
{
...
String IPAdress ="";
String PORT = "";
String clientID = "";
C myC = new C();
// hiermit übergibst du der Methode getSettings(this) eine Referenz auf das Objekt der Klasse A
myC.getSettings(this);
}
class B
{
...
String IPAdress ="";
String PORT = "";
String clientID = "";
C myC = new C();
myC.getSettings();
}
class C
{
...
public void getSettings(A a)
{
// normalerweise sollte man dafür "getter-Methoden" benutzen!
a.IPAdress = "127.0.0.1";
a.PORT = "10";
a.clientID = "44";
// aufrufendeKlasse.IPAdress = IPAdress;
}
}
Ich hab das nun mal ausprobiert, aber vielleicht ist es heute noch zu früh für mich:
(hab mal die Klasse B weggelassen):
Java:
class A
{
public A()
{
String IPAdress ="";
String PORT = "";
String clientID = "";
C myC = new C();
myC.getSettings(this);
}
public static void main(String[] args)
{
A myA = new A();
}
}
class C
{
public void getSettings(A a)
{
a.IPAdress = "127.0.0.1";
a.PORT = "10";
a.clientID = "44";
}
}
wenn ich den Compiler anwerfe bringt dieser folgende Fehlermeldungen:
javac A.java
./C.java:5: cannot find symbol
symbol : variable IPAdress
location: class A
a.IPAdress = "127.0.0.1";
^
./C.java:6: cannot find symbol
symbol : variable PORT
location: class A
a.PORT = "10";
^
./C.java:7: cannot find symbol
symbol : variable clientID
location: class A
a.clientID = "44";
^
3 errors
Wobei man sagen muss, dass der direkte Zugriff von außen auf Variablen nicht üblich ist. Instanzvariablen sollten von außen nicht sichtbar sein.
Im Allgemeinen werden dafür get()- und set()-Methoden in die Klasse eingefügt, die die Attribute der Klasse manipulieren.
Füge ich nun allerdings die Klasse B hinzu, dann funktionierts nicht mehr wie gewünscht:
Java:
class A
{
String IPAdress ="";
String PORT = "";
String clientID = "";
public A()
{
C myC = new C();
myC.getSettings(this);
}
public static void main(String[] args)
{
A myA = new A();
}
}
class B
{
String IPAdress ="";
String PORT = "";
String clientID = "";
public B()
{
C myC = new C();
myC.getSettings(this);
}
public static void main(String[] args)
{
B myB = new B();
}
}
class C
{
public void getSettings(A a)
{
a.IPAdress = "127.0.0.1";
a.PORT = "10";
a.clientID = "44";
}
}
javac B.java
B.java:10: getSettings(A) in C cannot be applied to (B)
myC.getSettings(this);
Ich hab natürlich vergessen zu sagen daß sowohl die Klasse A u. die Klasse B eine main-Methode enthalten.
Außerdem ist es sicher besser wie Ihr schon oben beschrieben habt getter und setter einzusetzen.
Trotzdem würde mich interessieren ob das lösbar ist.
Vielen Dank.
Deine Klasse C kann entweder auch noch folgende Methode implementieren
Java:
public void getSettings(B b)
{
b.IPAdress = "127.0.0.1";
b.PORT = "10";
b.clientID = "44";
}
aber einfacher wäre dann, dass die beiden Klassen(A und B) in irgendeiner "Beziehung" stehen. Ob nun über ein Interface, was beide Klassen implementieren, oder über Vererbung, oder oder oder
Aber da sind wir dann bei Design-Entscheidungen und da solltest du dir halt überlegen, was macht am meisten Sinn.
interessant zu erwähnen: bei einem gemeinsamen Interface wäre der direkte Zugriff auf Attribute gar nicht mehr möglich,
spätestens dann ist man gezwungen set-Methoden zu verwenden oder auch etwas kompakter:
public void update(String ip, String nochetwas, ..)
Mit interfaces kann ich noch nicht umgehen (bin mit meinen Grundlagen noch nicht soweit).
Werd fuers erste mal set-Methoden verwenden.
Vielen dank nochmals fuer die rasche Unterstuetzung.
Das klingt für mich aber nach: ich habe iwo eine Configuration definiert und will die in notwendigen Klassen verfügbar machen. Dann würde man aber entweder eine Referenz auf die Config mitgeben.
Ich würde es aber wiederum anderster machen: Für soetwas könnte man guice nutzen. Hier ein kleines tutorial von thE_29
Also, dann ist das was du machst ein designfehler. Eine Updatemöglichkeit ist ziemlich aufwendig und fehleranfällig. Normalerweise hält eine Klasse die daten (Model) und wenn eine Klasse solche Informationen braucht, gibst du dieser Klasse eine referenz auf das Model. Wenn sich iwas an der Datenstruktur ändert, brauchst du nur das Model zu aktuallisieren und alle anderen Klassen bekommen dann nur noch die aktuellen Daten:
Java:
class Config
{
private String ip;
public Config()
{
ip = "127.0.0.1";
}
public void setIP(String ip)
{
this.ip = ip;
}
public String getIP()
{
return ip;
}
}
public class Client
{
public static void main(String[] args)
{
Config conf = new Config();
Client user1= new Client(conf);
Client user2= new Client(conf);
System.out.println("IP1: " + user1.getIP());
System.out.println("IP2: " + user2.getIP());
conf.setIP("192.15.12.2");
System.out.println("IP1: " + user1.getIP());
System.out.println("IP2: " + user2.getIP());
}
private Config c;
public Client(Config c)
{
this.c = c;
}
public String getIP()
{
return c.getIP();
}
}