globale Konstante Variable

Hunk86

Cadet 4th Year
Registriert
Feb. 2010
Beiträge
121
Hallo zusammen,

ich hab eine klasse1 als Library die verschiedene Parameter hat, diese sollen von einer anderen Klasse klasse2 deklariert werden. Bisher löse ich dies so das in klasse1 die parameter als global definiert sind.

Also in klasse2

klasse1 k1;
k1.setparameter();
k1.machirgendwas();

dadurch das es sich um parameter handelt würde ich diese gerne konstant machen. Ist dies möglich? Ich will die Parameter nur einmal von klasse2 aus setzen und danach sollen diese nicht mehr verändert werden können.
 
Welche Programmiersprache?
 
Hunk86 schrieb:
dadurch das es sich um parameter handelt würde ich diese gerne konstant machen. Ist dies möglich?

Widerspricht sich. Entweder etwas ist konstant. Oder etwas kann (möglicherweise einmalig) verändert werden.


Hunk86 schrieb:
Ich will die Parameter nur einmal von klasse2 aus setzen und danach sollen diese nicht mehr verändert werden können.

Vorgehensweise wie bisher auch, nur zusätzlich prüfen, ob die Variablen bereits verändert wurden und je nachdem keine weitere Änderungen mehr erlauben. Je nach Typ der Variablen benötigt man dazu weitere Statevariablen.
 
Zuletzt bearbeitet:
Mache die betroffenen Parameter privat und setze sie im Konstruktor
 
Wenn die Parameter nur 1x gesetzt werden sollen und danach unveränderbar sein sollen, mach sie final. In Java würde man das so lösen:

Code:
class Klasse1 {
  private final typ param1;

  public Klasse1(typ param1) {
    this.param1 = param1;
  }
}

class Klasse2 {
  Klasse1 k1 = new Klasse1(wertFuerParam1);
}

Der Wert MUSS im Konstruktor gesetzt werden.



EDIT: die Idee von wahli ist auch möglich. Dann kann aber nicht ausgeschlossen werden, dass der Wert über eine Funktion oder sonstiges überschrieben werden kann. Allerdings ist das sinnvoll, wenn du den Wert innerhalb von Klasse1 weiter bearbeiten willst.

wahlis Vorschlag sähe in Java so aus:
Code:
class Klasse1 {
  private typ param1;

  public Klasse1(typ param1) {
    this.param1 = param1;
  }
}

class Klasse2 {
  Klasse1 k1 = new Klasse1(wertFuerParam1);
}
 
Zuletzt bearbeitet:
es geht vorallem drum das nix in Klasse1 dies ändern kann.

ALso wird das leider nicht gehen das ich es global konstant definier und eben erst später zum ersten mal deklariere.
Das Problem ist ich hab die parameter noch nicht während ich in klasse2 die klasse1 deklariere. Und im konstruktor wäre diese au von klasse1 änderbar

es handelt sich übrigends um c++

mir ist auch nix eingefallen, aber wär eben eine absicherung gewesen das sich nix ändert so muss ich eben darauf achten.
 
Jeder Datentyp hat einen Defaultwert. Dies kannst Du in den Set-Methoden überprüfen.

Code:
// Pseudocode:
int _inner = 0;
...
public void SetValue(int i) {
   if(_inner == default(int)) {
        _inner = i;
    }
}

EDIT:
Zu langsam gewesen :-/
 
Zuletzt bearbeitet:
Du kannst dir auch nen Container schreiben, der nur einmaliges eintragen erlaubt.
(Die Eintragungsmethode überschreiben -> if reinbasteln, ob der Key schon enthalten ist -> wenn ja, dann reinschreiben, ansonsten lassen)

Obs hier nötig ist oder sinnvoll, bezweifel ich stark :D
 
Zuletzt bearbeitet:
Hunk86 schrieb:
es geht vorallem drum das nix in Klasse1 dies ändern kann.

ALso wird das leider nicht gehen das ich es global konstant definier

Aber CONSTANT heißt "nicht änderbar". Eine Kostante wird bei der Deklaration initialisiert. Danach eben keine Änderung mehr möglich. Ansonsten muss man "Sicherungsmechanismen" implementieren, die eine Änderung schwer möglich machen.
 
Hunk86 schrieb:
Hallo zusammen,

ich hab eine klasse1 als Library die verschiedene Parameter hat, diese sollen von einer anderen Klasse klasse2 deklariert werden. Bisher löse ich dies so das in klasse1 die parameter als global definiert sind.

Also in klasse2

klasse1 k1;
k1.setparameter();
k1.machirgendwas();

dadurch das es sich um parameter handelt würde ich diese gerne konstant machen. Ist dies möglich? Ich will die Parameter nur einmal von klasse2 aus setzen und danach sollen diese nicht mehr verändert werden können.

Für mich klingt benneque's Lösung sehr vernünftig.

In C++ würde das etwa so aussehen:

Code:
class Klasse1
{
public:
	Klasse1( int wert1, double wert2 ) : m_wert1( wert1 ), m_wert2( wert2 )
	{
	}
	
private:
	const int m_wert1;
	const double m_wert2;
};

// Klasse2 muß dann halt an geeigneter Stelle eine Instanz von Klasse2 anlegen und ihr per Konstruktor die
// passenden Argumente übergeben:
Klasse1 instanzVonKlasse1( 5, 3.14 );
 
Zurück
Oben