Hilfe bei Programmstrukturierung

Status
Nicht offen für weitere Antworten.

Gayson

Bekanntes Mitglied
Hallo

Ich habe drei Datenstrukturen (Employee, Shift, FreeDay), die alle das gemeinsame Interface Data haben:
Code:
interface Data{
	String getName();
	int getID();}

Für jede Struktur habe ich habe ich eine Klasse geschrieben, die eine Liste von einer Struktur abspeichern und wieder einlesen kann (als XML-Datei auf die Platte):
Code:
class ShiftAccessor{
	public void write (Shift[])
	public Shift[] read()
	private load()
	private save()}
Code:
class EmployeeAccessor{
	public void write (Employee[])
	public Employee[] read()
	private load()
	private save()}
Code:
class FreeDayAccessor{
	public void write (FreeDay[])
	public FreeDay[] read()
	private load()
	private save()}

alle read und write-Methoden haben unterschiedliche Implentierungen, load und save ist überall gleich

Nun möchte ich einen "allgemeinen" Container schreiben, der mit Hilfe von Generics genauer Spezifiziert werden kann.
Code:
class DataContainer<Type extends Data> {
	void add(Type)
	void remove(Type)
	void save(Type)
	void read()
	int getUnusedID
}

Meine Frage ist:
abhängig davon, was Type ist, muss in save bzw. read ShiftAccessor, EmployeeAccessor oder FreeDayAccessor instanziert werden - doch wie bekomm ich das hin?
Danke!!
 
B

Beni

Gast
Kannst du nicht den Teil des Codes, der den Unterschied ausmacht, in die "Data"-Implementierungen reinschreiben? Dann wären die Accessor's überflüssig.

Ansonsten, wenn du überall Generics verwendest, müsste doch bereits beim Code schreiben klar sein, welcher Accessor erwartet wird? ???:L Nenn mir mal ein Beispiel, wo das nicht der Fall ist (und das auch Sinn macht :wink: ).

Da die Generics zur Laufzeit unbekannt sind, müsstest du sonst irgendwo zusätzliche Informationen in deinen Code schreiben. Aber mir fällt kein Beispiel ein, wo das auftritt. :bahnhof:
 

Gayson

Bekanntes Mitglied
Mh, scheint ja wirklich so einfach zu sein und einfach die Methoden in den Accessors in die Datenstrukturen selber zu schreiben. Gute Idee. Dann müsste es wahrhscheinlich auch mit dem Container klappen...

Danke!
 

Gayson

Bekanntes Mitglied
Ich habe jetzt die read() und write()-Methode in das Data-Interface mit rein genommen:
Code:
import java.util.LinkedList;

public interface Data<Type>{
	public String getName();
	public int getID();
	public void write(LinkedList<Type> list);
	public LinkedList<Type> read();
}

Gibt es eine Möglichkeit, write und read static zu setzen?
Ich würde gerne die Methoden z.B. per Employee.read() nutzen...
 

Gayson

Bekanntes Mitglied
Tschuldigung, aber ich muss nochmal was wissen, habe es mit dem static noch nicht hinbekommen.
Wollte es mal probieren, die Klasse Data abstract zu schreiben:
Code:
import java.util.LinkedList;

public abstract class Data<Type> {
	protected String name;
	protected int id;
	
	public String getName(){
		return name;
	}
	
	public int getID(){
		return id;
	}
	
	// must be overwritten
	public static void write(LinkedList<Type> list){}
	public static LinkedList<Type> read(){return null;}
}

Jetzt müssen halt nur Employee, Shift und FreeDay von Data erben und write bzw read überschreiben.
Ich erhalte jedoch eine Fehlermeldung bei Type bei jeder LinkedList:
Cannot make a static reference from a non-static context.
Ich könnte das Ganze natürlich nicht generisch machen, doch dann müsste ich ja jedesmal casten...
Wie mach ich das?
 
B

Beni

Gast
Da man static-Methoden nicht überschreiben kann, funktioniert das nicht.

Wie wäre es mit einer Factory "interface DataFactory<Type>", die die Elemente liest? Ich meine, irgendwann musst du ja sowieso bestimmen, obs jetzt Employee, Shift oder FreeDay ist. Da könntest du die Factory hinsetzen.
 

Gayson

Bekanntes Mitglied
Habe mir mal kurz was zum Konzept einer Factory durchgelesen, habe aber noch nicht ganz verstanden, was das mir helfen soll.
Was für Methoden sollen denn deiner Meinung in dem Factory-Interface stehen? Müsste davon denn nicht eine static sein, was ja nicht geht? Und soll das Interface für Employee, Shift und FreeDay sein?
 
B

Beni

Gast
Hmpf, nachdem ich nochmal das ganze durchgelesen habe... dann wären wir wieder bei deinem ersten Vorschlag. Hab ich mich im Kreis gedreht...

[Edit: wieso eigentlich static? Beim Schreiben musst du für jede Liste dasselbe machen, und die Datenspeziefischen Elemente passen schon in ein Data hinein. Beim Lesen geht es nur darum, den richtigen Typ zu finden. Aber das ist ein anderes Thema, weil dieser Schritt auf jeden Fall gemacht werden muss.]
 
B

Beni

Gast
Die Accessoren, die sind eigentlich auch nur Factories.

Wieso eigentlich static? Beim Schreiben musst du für jede Liste dasselbe machen, und die Teile die unterschiedlich sind, passen in Employee etc. rein. Beim Lesen geht es nur darum, den richtigen Typ zu finden. Aber das ist ein anderes Thema, weil dieser Schritt auf jeden Fall gemacht werden muss.

Ich hatte bei den Factories in die Richtung gedacht:
Code:
write( List<Data> list ){
  for( Data data : list ){
    write( "bla bla element x, sowieso und dort" );
    write( data.getTyp() );  // "employee" für Employee, etc...
    data.write();
  }
}

Code:
interface Factory<T>{
  public T create();
}

Code:
Map<String, Factory<Data>> factories = new Hashtable...

factories.put( "employee", 
  new Factory<Employee>(){
    Employee create(){ return new Employee(); }
  });

factories.put( "freeDay", 
  new Factory<FreeDay>(){
    FreeDay create(){ return new FreeDay(); }
  });

Code:
List<Data> read(){
  List<Data> list = new LinkedList<Data>();

  for( .. ){
    String typ = read();
    Data data = factories.get( typ ).create();
    data.read();
    list.add( data );
  }
}
 

Bleiglanz

Gesperrter Benutzer
nur mal zur Klarstellung

du kannst von generischen Typen keine neuen Instanzen erstellen (mit new T()), das geht prinzipiell nicht

Lösung A) factories, die für jede Konkrete Klasse das entsprechende neue Objekt zurückliefern [muss man natürlich für jede eigens implementieren]

Lösung B) per Reflection, dann musst du aber der entsprechenden Methode noch x.getClass() als Parameter übergeben, damit du zur laufzeit überhaupt weisst, was du instanzieren willst
 

Gayson

Bekanntes Mitglied
Hallo, ich bins nochmal.

Bin grad dabei, Beni's Idee zu verstehen. Komm an enigen Stellen nicht weiter, hier das, soweit ich bin:

Ziel: für FreeDay, Employee und Shift (Interface Data) soll es einen generischen Container geben.

Im Container soll ich factories verwenden:
Code:
public class Container<Type extends Data> {
	Map<String, Factory<Type>> factories = new Hashtable<String, Factory<Type>>(3);

	public Container(){
		factories.put( "employee",
		  new Factory<Employee>(){
		    Employee create(){ return new Employee(); }
		  });

		factories.put( "freeDay",
		  new Factory<FreeDay>(){
		    FreeDay create(){ return new FreeDay(); }
		  }); 
		  
		factories.put( "Shift",
		  new Factory<Shift>(){
		    Shift create(){ return new Shift(); }
		  }); 
	}

	public List<Type> read(){
		List<Type> list = new LinkedList<Type>();

		for( .. ){
			String typ = read();
			Type data = factories.get( typ ).create();
			data.read();
			list.add( data );
		}
	}
	
	public write( List<Type> list ){
		  for( Type data : list ){
		    write( "bla bla element x, sowieso und dort" );
		    write( data.getTyp() );  // "employee" für Employee, etc...
		    data.write();
		  }
	}
}

Folgendes verstehe ich nicht:
1. String typ = read(), wo/wie soll diese read() implementiert sein? Und das write in der write()-Methode?
2. for( Data data : list ), was soll das machen?

Hatte mir überlegt, falls ich nicht verstehe, wie du dass machen willst, einfach den Typ per Konstruktur zu übergeben, also dass ein Aufruf z.B. per
Container<Employee> c = new Container<Employee>("employee")
nur möglich ist...
 
B

Beni

Gast
Zu 2: ist eine Kurzform, für alle Elemente durchgehen. Gibts ab Java 1.5.

Zu 1: k.A, ich weiss ja nicht, woraus du liest. Wo auch immer du rausliest, lies einen früher reingeschriebenen String raus.

Der Trick später ist einfach: mit dem String schaut man in einer Tabelle nach, welche Factory zu ihm gehört, und ruft die "create" Methode dieser Factory auf.
Eigentlich steht in dieser Tabelle für jeden String-Typ, welcher Konstruktor von welcher Klasse verwendet werden soll.
 

Gayson

Bekanntes Mitglied
Okay, dann bleibt mir wohl es nicht anderes übrig, entweder ganz auf einen generischen Container zu verzichten und einen für alle drei Typen anzulegen oder halt für einen Container so immer einen Aufruf zu machen:
Container<Employee> c = new Container<Employee>("employee")

Kannst du mir sagen, warum ich bei

Code:
      factories.put( "employee",
        new Factory<Employee>(){
          Employee create(){ return new Employee(); }
        });

folgende Fehlermeldung erhalte:
The method put(String, Factory<Type>) in the type Map<String,Factory<Type>> is not applicable for the arguments (String, new Factory<Employee>(){})
 
B

Beni

Gast
Nein, weiss nicht wieso. Aber das hier sollte gehen:
Code:
class Container {
    Map<String, Factory<Data>> factories = new Hashtable<String, Factory<Data>>(3);

    public Container(){
       factories.put( "employee",
         new Factory<Data>(){
           public Employee create(){ return new Employee(); }
         });
Halt Employee durch Data ersetzt. Ist ja auch egal, man weiss sowieso bald nichtmehr, was es ist.
 

Gayson

Bekanntes Mitglied
Ja. das funktionerte.

Denke, dass ich jedoch folgende Implementation verwenden werden, auch wenn die nicht ganz schön ist...

Code:
public class Container<Type extends Data>{
   Data data;

   public Container(String type){
		if(type.equals("employee"))
			data=new Employee();
		else if(type.equals("shift"))
			data=new Shift();
		else if(type.equals("employee"))
			data=new FreeDay();
   }

   public LinkedList<Type> read(){
	   return (LinkedList<Type>)data.read();
   }
   
   public void write( LinkedList<Type> list ){
        data.write(list);
   }
}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Hilfe bei Methode Allgemeine Java-Themen 14
M Javascript Hilfe bei ToDoList? Allgemeine Java-Themen 1
A Java Programm erstellen hilfe Allgemeine Java-Themen 10
Momo16 Brauche Hilfe - Java Projekt kann nicht erstellt werden Allgemeine Java-Themen 12
T Hilfe bei negation von suchabfrage Allgemeine Java-Themen 2
Peterw73 Hilfe bei Java gesucht Allgemeine Java-Themen 3
N Hilfe bei RegEx benötigt Allgemeine Java-Themen 3
A Hilfe beim Verständnis Allgemeine Java-Themen 16
V Hilfe mit Java Code Allgemeine Java-Themen 4
T Hilfe bei Programm. IDE: Eclipse mit EV3-Plugin, lejos Allgemeine Java-Themen 8
alinakeineAhnungv Hilfe bei einem Straßenbahn-Projekt von mir Allgemeine Java-Themen 18
Aboya Kugel mit Hilfe von Dreiecken rekursiv zeichnen Allgemeine Java-Themen 2
K Anzeigemöglichkeit von Bildern in JavaFX mit Hilfe von MongoDB GridFS Allgemeine Java-Themen 0
A Preisberechnung, Hilfe Allgemeine Java-Themen 4
M Bräuchte Hilfe bei der Aufgabe Allgemeine Java-Themen 1
s_1895 Hilfe bei Java Tic Tac Toe Allgemeine Java-Themen 8
W Suche Ursache für NPE - woher kommt sie? (Hilfe beim Debugging) Allgemeine Java-Themen 19
J Hilfe, Jar Datei kann nicht ausgeführt werden Allgemeine Java-Themen 2
M Hilfe bei einer Java Programmieraufgabe! Ab morgen Montag um 08:00 Uhr Allgemeine Java-Themen 5
B Bei Email: FW / AW... - Hilfe bei String suche Allgemeine Java-Themen 21
U Erste Schritte Hilfe bei simplem Glücsspiel in Java Allgemeine Java-Themen 4
K OOP Suche Hilfe + Erklärung für eine Hausaufgabe Allgemeine Java-Themen 1
K Objektorientierung, hilfe Allgemeine Java-Themen 9
V Bilder bei bestimmten Zeiten wechseln, bitte um Hilfe Allgemeine Java-Themen 5
D Hilfe bei Informatik Hausaufgaben Allgemeine Java-Themen 30
RalleYTN Brauche Hilfe beim Run-Length-Decoding Allgemeine Java-Themen 9
S Hilfe bei dem Auslesen einer YAML Datei Allgemeine Java-Themen 8
F NetBeans Hilfe!!! Allgemeine Java-Themen 23
H Schiffe versenken JButton Schiffe mit GUI verbinden Hilfe! Allgemeine Java-Themen 2
M Bitte Hilfe mit REGEX (Negieren) Allgemeine Java-Themen 4
E HILFE !! Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/io/FileUtils Allgemeine Java-Themen 4
S GetMethode erstellen mit Hilfe von Parametern Allgemeine Java-Themen 9
J Java "Bank Programm" Brauche eure Hilfe Allgemeine Java-Themen 3
B Hilfe bei Übungsblätter Allgemeine Java-Themen 9
O Erste Schritte Benzinverbrauch Code Hilfe Allgemeine Java-Themen 3
C Hilfe Bei Vegas Slide Allgemeine Java-Themen 0
B Hilfe!! spiel um Funktion des Selektierens erweitern (mit ASCII-Tabelle) Allgemeine Java-Themen 3
Ice4P4rty Hilfe Bei Promillerechner Allgemeine Java-Themen 9
C Atfx mit Hilfe von OpenAtfx auslesen Allgemeine Java-Themen 1
perlenfischer1984 Hilfe bei Design (Pattern) Allgemeine Java-Themen 5
G Hilfe bei Projektarbeit Allgemeine Java-Themen 5
GenerationLost Input/Output Custom Serialization - hilfe bei Realisierung Allgemeine Java-Themen 8
J Hilfe!!! Ausbildung Allgemeine Java-Themen 14
H Hilfe bei Erstellung eines Hilfe Fenster bei Tastendruck (F1 bei Win98) Allgemeine Java-Themen 5
B Swing Hilfe bei Abfrage von Benutzernamen und Passwort Allgemeine Java-Themen 2
T Hilfe bei Code Allgemeine Java-Themen 3
U Swing Hilfe beim Quellcode für ein Codierungs-/Decodierungsprogramm Allgemeine Java-Themen 9
S Hilfe bei Gui Allgemeine Java-Themen 3
O Best Practice Hilfe bei Algorithmus gesucht Allgemeine Java-Themen 10
GRAZZ0R Hilfe zum Spiel Mensch ärger dich nicht Allgemeine Java-Themen 1
C Hilfe bei den Ausgaben Allgemeine Java-Themen 4
K Hilfe bei GUI für Pizza-Service Allgemeine Java-Themen 11
J Hilfe bei Datumsberechnung aus Textfeld Allgemeine Java-Themen 10
I Bitte Drngend hilfe Allgemeine Java-Themen 2
C Hilfe bei NoClassDefFoundError Allgemeine Java-Themen 14
C Hilfe bei einer Fehler meldung Allgemeine Java-Themen 3
I Methoden Schnelle Hilfe benötigt - Kleines Video/Slideshow aus mehreren Bildern erstellen Allgemeine Java-Themen 3
C Hilfe bei einer Point Ausgabe Allgemeine Java-Themen 7
S Probleme mit meinem MacBook Pro DRINGEND HILFE erbeten! Allgemeine Java-Themen 17
N Erste Schritte [HILFE] effizienter,leistungsfähigermbackground Pixelbot Allgemeine Java-Themen 5
A Hilfe gesucht Allgemeine Java-Themen 44
X ArrayList will nicht so wie ich will. Hilfe Allgemeine Java-Themen 8
C Hilfe bei einer Fehlermeldung Allgemeine Java-Themen 5
C Hilfe bei MalformedURLException Allgemeine Java-Themen 7
D Baum zeichnen hilfe Allgemeine Java-Themen 4
M Hilfe bei parseInt Allgemeine Java-Themen 4
F Compiler-Fehler Hilfe bei Startup error Allgemeine Java-Themen 3
D Mit Hilfe von Java aus Excel-Sheet Zellen in neues Excel Dokument kopieren Allgemeine Java-Themen 3
F Socket NullPointerException Bitte um hilfe! Allgemeine Java-Themen 12
M Input/Output Java + OCR ? Erfahrungen und bitte um Hilfe Allgemeine Java-Themen 12
M Brauche Hilfe bei Quellcodeverständnis Allgemeine Java-Themen 4
B Zahlen ausgeben hilfe! Allgemeine Java-Themen 8
S Java USB dringend Hilfe! Allgemeine Java-Themen 6
X Hilfe bei Programm Allgemeine Java-Themen 5
zer0zer0 Best Practice apache common cli - optionen für hilfe ausblenden Allgemeine Java-Themen 5
F Bitte um Hilfe! Allgemeine Java-Themen 5
S Hilfe bei geeignetem Pattern (Decorierer) Allgemeine Java-Themen 2
D Brauche Hilfe bei Rechnung (Exponentiation) Allgemeine Java-Themen 12
F Brauche Hilfe bei Java Allgemeine Java-Themen 6
S Hilfe bei simplem Programm Allgemeine Java-Themen 3
J Ein blutiger Anfänger braucht Hilfe Allgemeine Java-Themen 7
B Hilfe bei JUnit Test Allgemeine Java-Themen 1
A ALTER TABLE mit Hilfe von RegEx zerlegen, splitten Allgemeine Java-Themen 5
B Dringend Hilfe gesucht für Struktogramm Allgemeine Java-Themen 11
C Brauche Hilfe mit Modulo Strategie Allgemeine Java-Themen 2
S Brauche Hilfe: Prüfungsaufgabe Java Allgemeine Java-Themen 8
J Probleme bei kompilieren ... Bitte um Hilfe Allgemeine Java-Themen 2
G java.exe in System 32. Hilfe!!! Allgemeine Java-Themen 8
M google plus java api - Anfänger sucht Hilfe Allgemeine Java-Themen 7
M Hilfe mit JOptionPane Allgemeine Java-Themen 2
I Hilfe: Klasse Vieleck Allgemeine Java-Themen 5
I javax.sound.sampled.* - Hilfe zu den Controls Allgemeine Java-Themen 8
C Hilfe bei Adressbuch-Programmierung, wie am Besten mit JList implementieren Allgemeine Java-Themen 2
S Hilfe bei der Cosinusapproximation Allgemeine Java-Themen 10
K Arraylist Hilfe Allgemeine Java-Themen 13
K Hilfe Felder Allgemeine Java-Themen 7
T Hilfe im Lizenz-Dschungel Allgemeine Java-Themen 11
S brauche Hilfe für ssh connection in java Allgemeine Java-Themen 6
W sql Query abspeichern selber variabele hilfe...? Allgemeine Java-Themen 16
N Hilfe bei Projekt Allgemeine Java-Themen 5

Ähnliche Java Themen


Oben