Singleton shallow copy vom Inhalte

  • 4 Antworten
  • Letztes Antwortdatum
H

HerrFatalVonError

Neues Mitglied
1
Hallo zusammen,

ich habe ein kleines Problem. Vielleicht hat jemand einen Tipp für mich.

Ich habe eine Singleton-Klasse welche ich über der ganzen Laufzeit der Activity bearbeiten und aufrufen kann.
Nun möchte ich den Inhalt dieser Singleton-Klasse (MyActualPlan) in eine andere Klasse schreiben ohne gleich die Reference mitzunehmen bzw. mit einer neuen Reference, was wiederum gegen das Singleton-Konzept spricht.

Habe schon einwenig über Clonen gelesen aber irgendwie kriege ich das nicht hin. Hier mal ein kleiner Codeauszug.


Code:
public class DoneWorkout implements Serializable {

    private static final String TAG = "DoneWorkout";
    private PlanObject mPlan;
    private ExerciseObject exerciseObject;
    private Workout doneWorkout;

    private long timeInMillies;
    private int workoutposition;
    private Workout currentWorkout;

    private AnalyseData mAnalysedata;


    public DoneWorkout(int workoutposition){
        this.workoutposition = workoutposition;

        timeInMillies = System.currentTimeMillis();


        MyActualPlan plan = MyActualPlan.getInstance();

        mPlan = new PlanObject();
        this.mPlan.setPlanTitle(plan.getPlanTitle());
        this.mPlan.setPlanArt(plan.getPlanArt());
        this.mPlan.setWorkoutList(plan.getWorkoutList());
        this.mPlan.setPlanDescription(plan.getPlanDescription());
        this.mPlan.setDifficult(plan.getDifficult());
        this.mPlan.setExecutionDescription(plan.getExecutionDescription());
        this.mPlan.setImgPlanPath(plan.getImgPlanPath());
        this.mPlan.setImgResource(plan.getImgResource());
        this.mPlan.setPlan_id(plan.getPlan_id());
        this.mPlan.setUsername(plan.getUsername());
        this.mPlan.setUser_id(plan.getUser_id());
        this.mPlan.setDate_created(plan.getDate_created());
        this.mPlan.setPauseCounter(plan.getPauseCounter());

        doneWorkout = mPlan.getWorkoutList().get(workoutposition);

        currentWorkout = mPlan.getWorkoutList().get(workoutposition);

    }

    public DoneWorkout(ExerciseObject exerciseObject){
        timeInMillies = System.currentTimeMillis();
        this.exerciseObject = exerciseObject;

    }
}
 
Habe eine Lösung gefunden, wobei mir diese mehr als unsauber vorkommt.
Speichere den Singleton als SharedPref ab und lade diesen dann wieder vorm Übtrag. Damit verliert der Singleton seine Referenz und kopiert quasi nur den Inhalt... 🤷‍♂️

wird mir das später mal auf die Füßé fallen ? i dont know...
 
Hallo
Irgendwie verstehe ich dein Konzept Prinzip nicht.
Du hast einen Singleton in den du die Daten (deinen Plan speicherst).
Du kannst mit einer abfragen nach der Instanz vom Singleton, in jeder Activity darauf zugreifen.


Klar nach dem du die App beendest sind alle Daten in der Singleton Klasse weg.
Willst du die Daten beim App Neustart wider haben must du sie vor dem App beenden speichern.
Wo ist dir überlassen SharedPref , DB …
Beim App Neustart musst du die Daten auch wieder einlesen.

Du kannst den Singleton nicht speichern nur die Daten die du in der Klasse hältst.
 
Zuletzt bearbeitet:
Achso, okay, ich versuche es verständlicher.
Ich habe die Singleton-Klasse, welche als aktueller Plan ("MyActualPlan") während der App-Laufzeit bearbeitet wird. Nachdem der Plan durch den Benutzer abgearbeitet wurde sollen die Daten in eine DoneWorkout Klasse geschrieben werden und in einer DoneWorkoutList als SharedPref gespeichert werden.

Mein Problem: So wie in dem Codebeispiel oben wird die Referenze aus der Singleton-Klasse der DoneWorkout Klasse mitgeben. Wenn ich den Plan jetzt nur einmal bearbeitet habe und die Daten in die DoneWorkout Klasse geschrieben habe. Alles gut. Wenn ich den Plan jetzt weiterbearbeite und den wieder in ein neues DoneWorkout Objekt (enthält ja jetzt andere Daten) schreibe, ändert er das erste DoneWorkout Objekt in der Liste auch, da beide Objekte auf den Singleton Inhalt referenziert sind.
Hoffe das war diesmal verständlicher, sorry 😅

Soweit logisch. Aber wie umgehe ich das ?
Wenn ich die Daten aus dem Singleton mit einer anderen Referenz in ein neues Objekt speichern möchte. Quasi eine Kopie mit geänderter Referenz der Singleton Klasse.

oder vielleicht ist mein Konzept einfach nicht Programmierkonform. Ich lerne noch :)
 
Zuletzt bearbeitet:
Wenn ich die Daten aus dem Singleton mit einer anderen Referenz in ein neues Objekt speichern möchte. Quasi eine Kopie mit geänderter Referenz der Singleton Klasse.
Sowas geht nicht ein Singleton wenn es einer ist hat zur Laufzeit immer die gleiche Instanz.
 

Ähnliche Themen

S
Antworten
15
Aufrufe
1.646
shareking
S
S
Antworten
0
Aufrufe
1.332
Sasusi
S
T
Antworten
1
Aufrufe
764
swa00
swa00
Zurück
Oben Unten