Modularisierung von Anwendungen

Plauzi92

Aktives Mitglied
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)


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 :)
 

mrBrown

Super-Moderator
Mitarbeiter
Modularisierung und ServiceLoader sind erstmal zwei verschiedene Dinge, die nicht immer zusammen genutzt werden. Modularisierung selbst ist unabhängig von ServiceLoader, und wird auch überwiegend ohne genutzt.

ServiceLoader macht dann Sinn, wenn ein Modul eine Schnittschelle definiert und ein anderes Module diese implementiert – und an der Stelle liegt in deinem Beispiel der Fehler, da ModulA die Schnittstelle sowohl definiert als auch implementiert.
Um das sinnvoll zu nutzen, müsstest du in ModuleB für ObjektService und Objekt jeweils Interfaces definieren – ModuleA implementiert diese dann, und stellt sie über den ServiceLoader bereit.
 

Ähnliche Java Themen

Neue Themen


Oben