Hi Leute,
ich beschäftige mich mit der Modularisierung einer Anwendung. Der Sinn dahinter, so wie ich es verstanden habe, soll sein, dass man neue Funktionen o.Ä. schnell und einfach in das Modul hinzufügen kann, dass diese anbietet, möglichst ohne, dass der Code in dem Modul das sie verwendet, großartig geändert werden muss.
Ich verstehe zwar den Sinn dahinter, aber nicht wirklich die sinnvolle Anwendung.
Ich habe mir ein bisschen Code im Internet und Vorlesungsfolien zusammengesucht und mal was zusammengeschrieben. (Was in meinen Augen überhaupt keinen Sinn macht)
Jetzt habe ich zwar den ServiceLoader benutzt und es funktioniert auch soweit. Da ich aber die Klasse "Objekt" anscheinend ohnehin importieren muss, könnte ich ja auch einfach über new Objekt() eine Instanz davon erstellen.
Dadurch, dass ich den ObjektService mit Objekt anbiete, darf ich in "Objekt" keinen Konstruktor benutzen. (Also abgesehen von dem Konstruktor der sowieso da ist).
Das heißt, das einzige was mir der ServiceLoader so bringt, ist der Nachteil, dass ich die Objekte nicht direkt mit Parametern setzen kann, sondern diese umständlich über die ObjektService Klasse mit Methoden aus der Objektklasse setze.
Hat jemand vielleicht ein Codebeispiel wie ich den ServiceLoader richtig einsetze? So wie es jetzt ist, kann es ja nicht Sinn der Sache sein.
Bin für jede Hilfe dankbar
ich beschäftige mich mit der Modularisierung einer Anwendung. Der Sinn dahinter, so wie ich es verstanden habe, soll sein, dass man neue Funktionen o.Ä. schnell und einfach in das Modul hinzufügen kann, dass diese anbietet, möglichst ohne, dass der Code in dem Modul das sie verwendet, großartig geändert werden muss.
Ich verstehe zwar den Sinn dahinter, aber nicht wirklich die sinnvolle Anwendung.
Ich habe mir ein bisschen Code im Internet und Vorlesungsfolien zusammengesucht und mal was zusammengeschrieben. (Was in meinen Augen überhaupt keinen Sinn macht)
Java:
package ModulB;
import java.util.List;
import java.util.ServiceLoader;
import java.util.ServiceLoader.Provider;
import java.util.stream.Collectors;
import ModulA.Objekt;
import ModulA.ObjektService;
public class Main {
public static void main(String[] args) {
ServiceLoader<ObjektService> loader = ServiceLoader.load(ObjektService.class);
List<ObjektService> services = loader.stream().map(Provider::get).collect(Collectors.toList());
ObjektService objekte = services.get(0);
Objekt TestObjekt = objekte.neuesObjekt("TestName", 50);
System.out.println(TestObjekt.getName());
System.out.println(TestObjekt.getLaenge());
}
}
Java:
package ModulA;
public class Objekt extends ObjektService {
private String name;
private int laenge;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getLaenge() {
return laenge;
}
public void setLaenge(int laenge) {
this.laenge = laenge;
}
}
Java:
package ModulA;
public abstract class ObjektService {
public Objekt neuesObjekt(String name, int laenge) {
Objekt c = new Objekt();
c.setName(name);
c.setLaenge(laenge);
return c;
}
}
Java:
import ModulA.ObjektService;
import ModulA.Objekt;
module ProjektModulA {
exports ModulA to ProjektModulB;
provides ObjektService with Objekt;
}
Java:
import ModulA.ObjektService;
module ProjektModulB {
requires ProjektModulA;
uses ObjektService;
}
Jetzt habe ich zwar den ServiceLoader benutzt und es funktioniert auch soweit. Da ich aber die Klasse "Objekt" anscheinend ohnehin importieren muss, könnte ich ja auch einfach über new Objekt() eine Instanz davon erstellen.
Dadurch, dass ich den ObjektService mit Objekt anbiete, darf ich in "Objekt" keinen Konstruktor benutzen. (Also abgesehen von dem Konstruktor der sowieso da ist).
Das heißt, das einzige was mir der ServiceLoader so bringt, ist der Nachteil, dass ich die Objekte nicht direkt mit Parametern setzen kann, sondern diese umständlich über die ObjektService Klasse mit Methoden aus der Objektklasse setze.
Hat jemand vielleicht ein Codebeispiel wie ich den ServiceLoader richtig einsetze? So wie es jetzt ist, kann es ja nicht Sinn der Sache sein.
Bin für jede Hilfe dankbar