Klassenattribut nur 1 mal setzen können

  • Themenstarter Themenstarter Richard1
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
R

Richard1

Gast
Hallo, hat von euch jemand eine Lösung für das folgende Problem:
ich habe ein einfaches Objekt mit 4 public static final String Konstanten.
Ich kann von dieser Klasse beliebig viele Instanzen erzeugen,
jedoch darf jedes Objekt nur einmal mit einem Wert String Konstanten belegt sein.

Code:
public static final String TYPE_BASIS = "Basis";
	public static final String TYPE_EXTEND = "Erweitert";
	public static final String TYPE_EXTRAG = "Zusatzdienste";
	public static final String TYPE_SERVICE = "Service";

Wenn ich also ein Objekt erzeuge und setze für dieses Objekt TYP_BASIS, so soll
verhindert werden, dass dieser TYP_BASIS von keinem nachfolgend erzeugten Objekt
mehr gesetzt werden?

Grüße Richard
 
Code:
private static String type;

Irgendwo hast du dann eine Methode

Code:
setType(String type) {
  if (Klasse.type == null) {
    Klasse.type = type;
  }
  // ist Klasse.type gesetzt wird der Aufruf ignoriert
}
 
öh, blubb? Wenn also Objekt A TYPE_BASIS im Konstruktor übergeben bekam, dann soll das später erstellte Objekt B seine Übergabe ignorieren und ebenfalls TYPE_BASIS annehmen?

Code:
class Ignorierer {

     public static final String TYPE_BASIS = "1";
     public static final String TYPE_BLAH = "2";

     private static String ICH_WAR_ZUERST_DA = null;

     public static Ignorierer getInstance(String parameter) {
          if(ICH_WAR_ZUERST_DA == null) {
                ICH_WAR_ZUERST_DA = parameter;
          }
          return new Ignorierer();
     }

     private Ignorierer() {}
}

Nicht schön, aber du hast es nicht anders gewollt.
Dein Programmdesign halte ich allerdings für äußerst fragwürdig...

mpG
Tobias

Verdammt zu langsam!
 
ok danke euch.

ja bestimmt ist das nicht die schönste lösung aber wie soll ich es auch besser machen
wenn ich ein Objekt habe, von dem beliebig viele instanzen erzeugt werden, aber bestimmte
Attribute dieses Objektes eben nur einmal gesetzt werden dürfen. indem ich dem konstruktor
diese Attribute einfach nicht setze sondern manuell?
Bitte um Vorschläge :-/
 
Gegenfragen:
- Warum sollen diese nur einmal gesetzt werden können?
- Wie ist das Verhalten definiert, wenn nachträglich geändert werden soll? Schweigen im Walde? Exception?
 
Ich würde das Ganze mit ner Enum lösen, indem ich mir global merke, welche Elemente der Enum schon vergeben wurden:

Code:
public class Foo {

  public enum Kind {
    BASIS,
    EXTEND,
    EXTRAG,
    SERVICE
  }

  private Kind kind;

  private static Set<Kind> gone = new TreeSet<Kind>();

  public Foo(Kind kind) {
    if(!gone.add(kind)) {
      throw new Exception();
    } else {
      this.kind = kind;
    }
  }

  protected void finalize() {
    try {
      gone.remove(this.kind);
    } finally {
      super.finalize();
    }
  }
}
 
bei den strings handelt es sich um überschriften, es gibt insgesamt 4. diese beinhalten jeweils listen von verschiedenen aufzählungen.

die weiteren klassen, die sich meiner klasse bedienen zum befüllen des dokuments sind leider so aufgebaut, dass sie keine anderen weg erlauben als diesen, außerdem muss der ablauf sequentiell sein:

also objekt erzeugen, überschrift angeben, beliebig objekte anhängen
objekt erzeugen, neue überschrift angeben, bel. objekte an diese überschrift anhängen
...

es wird ein inhaltsobjekt erzeugt und 1 von 4 static attributen wird gesetzt.
nun operieren auf diesem objekt einige methoden, die als inhalt unter die überschrift gesetzt werden.

die weiteren instanzen, die erzeugt werden, werden nun so lange an die erste angegebene überschrift gehängt, bis ein objekt wieder ein neues attribut (eine neue überschrift) erzeugt.
da man natürlich ohne weiteres beim erzeugen weiterer objekte im mom immer neue überschriften setzen kann, soll dies verhindert werden, da der inhalt zu genau 1 überschrift gehört.
 
ok ich danke euch vielmals. ich denke die ansätze sind schon ganz brauchbar für micht.
ich werde es irgendwie lösen können.

gruß
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben