2017-11-03 6 views
-1

Ich habe diese Frage, wie ich versuche, mein Programm „besser“ zu machen: PWie Objekt ändern Attribute innerhalb Methoden dynamisch

class GlobalVariables { 

    int att1; 
    int att2; 
    int att2;... 

Ich verwende diese Klasse als eine Möglichkeit, jeden zu behandeln ziemlich globaler Wert, den ich in meinem Programm brauche.

Diese Klasse GlobalVariables enthält viele Attribute, von denen jedes von einem Sensor abgerufen und von method3 geändert werden kann. Dies ist eine Validierungsmethode, um einige der Werte in einem Bereich zu halten.

In der Hauptklasse habe ich ein Objekt eine andere Klasse (sagen wir class2).

Diese Objekte (lassen car sagen) hat eine Methode:

car.method(gl) 

gl eine Instanz von GlobalVariables zu sein.

Nun, innerhalb Methode, rufe ich method2 und innerhalb ich rufe method3 (alle von class2).

this.method3 (int att1, int att2, int att3,) 
this.method3 (int att2, int att3, int att1,) 
this.method3 (int att3, int att1, int att2,) 

Im Moment haben wir viele Anrufe von method3 und die 3-Parameter können durch eine Kombination dieser Sensorwerte werden so sein att37 in einer Angelegenheit zu sprechen att1 könnte.

So die Erklärung von method3 ist wie:

public void method3 (int n1, int n2, int n3){ 
    n3=n1+n2; 
} 

Was soll ich tun, um die globalVariable.attXXX zu ändern, wenn Java nur uns nach Wert übergeben Werte können.

Ich könnte natürlich 2 weitere Methoden und rufen Sie die entsprechende Methode und mit einem SET, aber ich denke, es ist so ziemlich, was ich versuche zu vermeiden.

Wenn ich SET sage, meine ich SETTER

+0

Genau diesen Wert zurückgeben und auf dem anrufenden Standort zuweisen. – Elazar

+0

Wenn diese ** global ** sind (etwas, das Sie in der OO-Programmierung vermeiden müssen), dann könnten Sie einfach 'gl.att1 = 1' schreiben. oder etwas ähnliches. Dann sollten Sie Ihre Methode3 ändern in: 'public void method3 (GlobalVariables g) {g.att3 = g.att1 + g.att2; } '. – MiguelKVidal

+0

Das ist keine gute Idee. Bitte verfolgen Sie diesen Ansatz nicht weiter, insbesondere nicht, wenn Sie eine Reflexion entdecken. Machen Sie sie entweder öffentlich oder schreiben Sie Getter und Setter für jedes Feld. –

Antwort

0

Wenn diejenigen, global sind (etwas, das man in der OO-Programmierung vermeiden müssen), dann könnte man nur gl.att1 = 1 schreiben.

Dann sollten Sie Ihre method3 ändern:

public void method3(GlobalVariables g) 
{ 
    g.att3 = g.att1 + g.att2; 
} 

Dies ist, wie es ist, einfach nur Ihr Problem zu lösen, den Wert eines Objekts einer anderen Klasse zu ändern.
Behalten Sie alle Kommentare im Kopf und versuchen Sie eine neue Herangehensweise an Ihr Problem. Wenn Sie wirklich den Wert eines Attributs ändern müssen, wäre der beste Ansatz ein setter.

auf Ihrem Kommentar Basierend, würde ich so etwas wie dies vorschlägt:

public class GlobalVariables { 
    private int x3; 
    public void method3(int a, int b) { 
     x3 = a + b; 
    } 
} 

erstellen Getter und Setter für Ihre Variablen je nach Bedarf. Wenn Sie eine andere Variable wie x2 aktualisieren müssen, erstellen Sie eine neue Methode, um es für Sie zu tun.
Wenn nicht, dann brechen Sie einige Regeln.In diesem Fall brechen Sie die Kapselung.

+0

Die Verwendung eines Setter würde erfordern 3 Methoden so in jedem ich ein anderes Attribut ändern oder einen anderen Parameter mit dem Namen des Feldes hinzufügen und einen Schalter, aber bedenken Sie, dies ist nur ein Beispiel, die echte Methode, die ich habe hat mehr Code und die ** Methode3 ** hat es mehr Male mit verschiedenen Kombinationen von Attributen aufgerufen. – Isidorito

+0

Meinst du 'void method (int v1, int v2, Objekt target)'? Wenn ja, dann machst du das wahrscheinlich falsch ... Obwohl dies möglich ist, wie du in einer anderen Antwort und Kommentaren sehen kannst, versuche dies zu vermeiden ... Ich werde meine Antwort aktualisieren ... – MiguelKVidal

1

eine Setter-Methode verwenden:

static void setAtt3(int x) { att3 = x; } 

void method3(int a, int b, IntConsumer setter) { 
    setter.accept(a + b); 
} 

Aufruf:

method3(att1, att2, GlobalVariables::setAtt3); 
Verwandte Themen