(Sehr großes Problem) Listen als static in anderen Klassen verwendet

Mika34

Bekanntes Mitglied
Hallo,

Ich habe gerade ein extrem großes Problem. Ich habe ein großes Projekt, für meine Kenntnisse, geschrieben und nun muss ich auf Gutdeutsch gesagt:"Die ganze Kacke ausbaden", welche ich gemacht habe 🙁.
Ich habe mehrere static Listen in meinen Klassen, welche ich momentan über getter erreiche. Das sieht dann so aus:
Klasse TrackManager
Java:
private static ArrayList<Track> allRails = new ArrayList<>();

    public ArrayList<BlankTrack> getAllTracks() {
        return this.allTracks;
    }
Jetzt werden alle den Kopf schütteln. Ja, ich auch. Ich dachte das änder ich am Ende, aber nun sind es knapp über 2500 Zeilen Code und ich weiß einfach nicht wo ich ansetzen soll.
Klasse MainManager
Java:
    TrackManager trackManager = new TrackManager();
    private ArrayList<BlankTrack> allTracks = railManager.getAllTracks();
Bekomme ich das überhaupt noch hin richtig zu implementieren oder muss ich das gesamte Projekt neu aufsetzen????
Ich bin über jeden Ratschlag, jede Hilfe, einfach Alles tierisch dankbar, wenn ihr euch melden würdet
 
Doch wenn ich in der Klasse mainManager auf
allRails.size() zugreifen will, dann gibt er mir eine leere Liste.. Obwohl diese gefüllt sein müsste
 
Ein leere Liste ist aber keine NPE. Das Problem wird sein, dass Du den TrackManager mehrfach instantiierst und dann natürlich jedesmal einen neue, leere Liste bekommst. Wenn dem so ist: TrackManager in MainManager als Instanzvariable anlegen, einmalig initialisieren und dann immer diese Instanz verwenden.
 
Ich bin mir nicht sicher ob ich dich richtig verstehe, aber was du vielleicht suchst ist ein Singleton Pattern.

Java:
class TrackManager {
  private static TrackManager INSTANCE = null;

  private ArrayList<Track> allRails;

  public TrackManager() {
    allRails = new ArrayList<>();
  }

  public static TrackManager getInstance() {
    if (INSTANCE == null) INSTANCE = new TrackManager();

   return INSTANCE;
  }

  // dein getter etc.
}

Und dann in MainManager

Java:
TrackManager.getInstance().getAllTracks();



PS.: @mihe7 4 Uhr hier im Forum, du bist ja krass xD
 
@MoxxiManagarm Ein (generic) Singleton geht eigentlich so
Java:
import java.util.ArrayList;

public class TrackManager<E> {
	private static TrackManager<?> tm = null;
	private final ArrayList<E> LIST = new ArrayList<E>();

	private TrackManager() {
	}

	@SuppressWarnings("unchecked")
	public static final <E> TrackManager<E> newInstance() {
		if (tm == null) {
			tm = new TrackManager<E>();
		}
		return (TrackManager<E>) tm;
	}

	public ArrayList<E> getLIST() {
		return LIST;
	}

	public static void main(String[] args) {
		TrackManager<Integer> manager = newInstance();
		manager.getLIST().add(5);
		System.out.println(manager.getLIST());
	}
}


Der Konstruktor muss private sein und die Instanz wird klein geschrieben, da sie nur effektiv final ist.
 
Ein leere Liste ist aber keine NPE. Das Problem wird sein, dass Du den TrackManager mehrfach instantiierst und dann natürlich jedesmal einen neue, leere Liste bekommst. Wenn dem so ist: TrackManager in MainManager als Instanzvariable anlegen, einmalig initialisieren und dann immer diese Instanz verwenden.
Sieht das in MainManager dann so aus:
Code:
    RailManager railManager = new RailManager();
    private ArrayList<BlankTrack> allRails = railManager.getAllRails();
 
Um das ganze auch noch threadsicher zu machen, wäre es am besten auf die lazy Initialization zu verzichten.

Java:
class TrackManager {
  private static final TrackManager INSTANCE = new TrackManager();

  private ArrayList<Track> allRails = new ArrayList<>();

  private TrackManager() { }

  public static TrackManager getInstance() {
    return INSTANCE;
  }

  // dein getter etc.
}

Aber ich denke, dass das Singleton hier nicht die Lösung der Wahl sein sollte.
 
Zuletzt bearbeitet:
Ich verstehe leider nicht was ich nun tun soll. Erstelle ich nur eine Instanvariable ohne einen railManager zu erstellen, dann bekomme ich eine NPE, weil er den railManager nicht findet...
Habt ihr eine Idee
 
Ich verstehe leider nicht was ich nun tun soll. Erstelle ich nur eine Instanvariable ohne einen railManager zu erstellen, dann bekomme ich eine NPE, weil er den railManager nicht findet...
Habt ihr eine Idee
Du lieferst, bis auf einige kurze Codeausschnitte, halt zu wenig Informationen für uns. Alles was gesagt werden konnte, wurde bereits gesagt.

Zeig doch mal auf das nötigste eingedampften Code, wo die einzelnen Instanzen erzeugt werden und wie sie zusammenhängen. Wenigstens die obersten Hirarchiestufen davon.

So in der Art:
Java:
class TrackManager {
    private ArrayList<Track> allRails = new ArrayList<>();

    public ArrayList<BlankTrack> getAllTracks() {
        return this.allTracks;
    }
}

class MainManager {

    // ?????????????????????????????????

}


// deine main()
public static main(String[] args) {

    // ??????????????????????????????????

}
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben