Inhaltsverzeichnis
Optimieren Sie die allgemeine Verarbeitungslogik für ähnliche Anforderungsobjekte
Verwendung abstrakter übergeordneter Klassen zur Implementierung der Code -Wiederverwendung
1. Definieren Sie die abstrakte Elternklasse
2. Die Unterklasse erbt die abstrakte Elternklasse
3.. Allgemeine Verarbeitungsmethoden refactorieren
Zusammenfassung und Best Practices
Heim Java javaLernprogramm Java Allgemeine Methodenoptimierung: Verwenden der abstrakten übergeordneten Klasse, um ähnliche Anforderungsobjekte zu verarbeiten

Java Allgemeine Methodenoptimierung: Verwenden der abstrakten übergeordneten Klasse, um ähnliche Anforderungsobjekte zu verarbeiten

Oct 05, 2025 am 12:24 AM

Java Allgemeine Methodenoptimierung: Verwenden der abstrakten übergeordneten Klasse, um ähnliche Anforderungsobjekte zu verarbeiten

In diesem Artikel wird untersucht, wie die Code -Redundanz beseitigt wird, indem abstrakte übergeordnete Klassen in Java eingeführt werden, wenn mehrere Anforderungsobjekte ähnliche Strukturen haben und dieselbe Geschäftslogik (z. B. Überprüfung) anwenden müssen. Durch die Übertragung gemeinsamer Felder und Verhaltensweisen in die abstrakte übergeordnete Klasse und die Nutzung von Polymorphismus kann die Methodenüberladung erheblich reduziert werden, wodurch die Wartbarkeit, Skalierbarkeit und Lesbarkeit der Code verbessert werden kann, wodurch wiederholtes Schreiben derselben Überprüfungslogik vermieden wird.

Optimieren Sie die allgemeine Verarbeitungslogik für ähnliche Anforderungsobjekte

In der Softwareentwicklung begegnen wir häufig auf solche Szenarien: Mehrere Datenübertragungsobjekte (DTOs) oder Anforderungsobjekte sind in der Struktur sehr ähnlich und müssen von derselben Geschäftslogik wie der Datenüberprüfung verarbeitet werden. Wenn Sie für jedes ähnliche Anforderungsobjekt eine unabhängige Verarbeitungsmethode schreiben, führt dies auch dann zu einer großen Menge an Code -Duplikation, die die Wartbarkeit und Lesbarkeit des Codes verringert.

Betrachten Sie die folgenden zwei Java -Datensatzstypen, mit denen Objekte erstellt und aktualisiert werden:

 öffentliche Aufzeichnungen createObjectralrest (
    CustomObjecta a,,
    CustomObjectB B,
    CustomObjectc c
) {}

öffentliche Aufzeichnungen updateObjectrequest (
    CustomObjecta a,,
    CustomObjectB b
) {}

Wenn wir die gleiche Überprüfungslogik für diese beiden Anforderungsobjekte ausführen müssen, besteht eine gängige Praxis darin, überlastete Verifizierungsmethoden separat zu erstellen:

 öffentliche Klasse RequestValidator {
    public void validateRequest (CreateObjectrequest createObjectrequest) {
        // viele der gleichen Verifizierungslogik ...
        System.out.println ("Validating createObjectrequest ...");
        // Beispiel: Überprüfen Sie, ob a und b leer sind, wenn (createObjectrequest.a () == null) {
            Neue illegalArgumentException werfen ("CustomObjecta kann nicht für CreateObjectrequest null sein.");
        }
        if (createObjectrequest.b () == null) {
            Neue IllegalArgumentException werfen ("CustomObjectB kann nicht für CreateObjectrequest null sein.");
        }
        // ... andere Überprüfung}

    public void validateRequest (updateObjectrequest updateObjectrequest) {
        // die gleiche große Menge an Überprüfungslogik ...
        System.out.println ("validieren updateObjectrequest ...");
        // Beispiel: Überprüfen Sie, ob a und b leer sind, wenn (updateObjectrequest.a () == null) {
            Neue IllegalArgumentException werfen ("CustomObjecta kann nicht für UpdateObjectrequest null sein.");
        }
        if (updateObjectrequest.b () == null) {
            Neue IllegalArgumentException werfen ("CustomObjectB kann nicht für UpdateObjectrequest null sein.");
        }
        // ... andere Überprüfung}
}

Obwohl diese Methode funktional machbar ist, gibt es offensichtlich eine Code -Redundanz. Wenn die Überprüfungslogik komplex wird oder geändert werden muss, muss sie an mehreren Stellen synchron aktualisiert werden, was äußerst anfällig für Fehler ist.

Verwendung abstrakter übergeordneter Klassen zur Implementierung der Code -Wiederverwendung

Um das obige Problem zu lösen, können wir die objektorientierten Merkmale von Java, insbesondere abstrakten Klassen und der Vererbung, verwenden, um diese Redundanz zu beseitigen. Die Kernidee besteht darin, die Felder und Verhaltensweisen zu identifizieren, die allen ähnlichen Anforderungsobjekten gemeinsam sind und sie in eine gemeinsame übergeordnete Klasse zusammenfassen.

1. Definieren Sie die abstrakte Elternklasse

Erstellen Sie zunächst eine abstrakte übergeordnete Klasse wie objectrequest, die Felder enthält, die von allen untergeordneten Anfragetypen geteilt werden.

 // Angenommen, die Basisklasse oder Schnittstelle von CustomObjecta und CustomObjectB ist CustomObject
öffentliche abstrakte Klasse objectrequest {
    geschütztes CustomObject a;
    geschütztes CustomObject B;

    // Konstruktor, Getter/Setter (falls erforderlich)
    public CustomObject geta () {
        Rückkehr a;
    }

    public CustomObject getb () {
        Rückkehr B;
    }
}

Anmerkungen:

  • Hier sind CustomObjecta und CustomObjectB in CustomObjects einheitlich, vorausgesetzt, sie haben eine gemeinsame übergeordnete Klasse oder Schnittstelle, oder wir können sie durch Typenlöschungen verarbeiten. Wenn CustomObjecta und CustomObjectB in praktischen Anwendungen völlig unabhängige Typen sind, aber nur die gleichen Feldnamen haben, müssen komplexere generische oder Schnittstellenschemata berücksichtigt werden. Nach der Problembeschreibung sind sie jedoch "gleiche Felder", was bedeutet, dass sie abstrahiert werden können.
  • Das Feld wird als geschützt oder öffentlich deklariert, sodass die Unterklasse über die Getter -Methode zugreifen oder Zugriff gewähren kann.

2. Die Unterklasse erbt die abstrakte Elternklasse

Lassen Sie die spezifischen Anforderungsobjekte (z. B. createObjectrequest und updateObjectrequest) diese abstrakte übergeordnete Klasse erben. Da Java -Datensatztypen Klassen nicht direkt erben können, können wir den Datensatz in die normale Klasse ändern oder auf die Logik der übergeordneten Klasse durch Kombinationen innerhalb der Aufzeichnung verweisen (dies verliert jedoch die polymorphe Bequemlichkeit, die durch Erbschaft gebracht wird). Um den durch Vererbung gebrachten Polymorphismus zu erreichen, entscheiden wir uns normalerweise dafür, die Aufzeichnung in die normale Klasse umzuwandeln.

 // createObjectrequest inherit objectrequest
öffentliche Klasse CreateObjectrequest erweitert objectrequest {
    private CustomObjectC C; // CreateObjectralrequest eindeutiges Feld öffentlich erstellenObjectrequest (CustomObjecta A, CustomObjectb B, CustomObjectC C) {
        this.a = a; // Feld aus der übergeordneten Klasse this.b = b; // Feld aus der übergeordneten Klasse this.c = c;
    }

    public CustomObjectC getC () {
        Rückkehr C;
    }
}

// updateObjectrequest inherit objectrequest
öffentliche Klasse updateObjectrequest erweitert objectrequest {
    // updateObjectrequest Es gibt kein eindeutiges Feld oder es gibt andere eindeutige Felder öffentlich updateObjectralrequest (CustomObjecta A, CustomObjectB B) {
        this.a = a; // Feld aus der übergeordneten Klasse this.b = b; // Feld aus der übergeordneten Klasse} geerbt
}

Hinweis: Die CustomObjecta- und CustomObjectB -Typen sind hier als CustomObjects in objectrequest einheitlich. Wenn CustomObjecta und CustomObjectB selbst keine Unterklassen von CustomObject sind, aber beide gemeinsame Eigenschaften haben, können A und B in objectrequest als ihre gemeinsame Schnittstelle oder Basisklassentyp deklariert werden. Der Einfachheit halber wird hier angenommen, dass sowohl CustomObjecta als auch CustomObjectB vom Typ CustomObject -Typ verwiesen werden können.

3.. Allgemeine Verarbeitungsmethoden refactorieren

Die Verifizierungsmethode muss nun nur die abstrakte übergeordnete Klasse als Parameter akzeptieren. Durch das Polymorphismus kann diese Methode alle von objectrequest geerbten Unterklasseninstanzen bewältigen.

 öffentliche Klasse RequestValidator {
    public void validateRequest (objectrequest objectrequest) {
        // Allgemeine Überprüfung der Logik, jetzt müssen Sie nur system.out.println schreiben ("Validierung generischer objectrequest ...");

        // Zugriff auf das gemeinsame Feld in der übergeordneten Klasse if (objectrequest.geta () == null) {
            Neue IllegalArgumentException werfen ("CustomObjecta kann nicht null sein.");
        }
        if (objectrequest.getb () == null) {
            Neue IllegalArgumentException werfen ("CustomObjectB kann nicht null sein");
        }

        // Wenn für bestimmte Unterklassen eine zusätzliche Validierung erforderlich ist, können Sie Instanz verwenden
        if (objectrequest Instance von createObjectrequest createRequest) {
            System.out.println ("Durchführen von CreateObjectrequest Spezifische Validierung.");
            if (createrequest.getC () == null) {
                Neue IllegalArgumentException werfen ("CustomObjectC kann nicht für CreateObJectrequest null sein.");
            }
        } else if (objectrequest instanceof updanceObjectrequest updateRequest) {
            System.out.println ("updateObjectrequest spezifische Validierung durchführen");
            // Eindeutige Überprüfung für updateObjectralrequest}
        // ... andere allgemeine Überprüfung}
}

Auf diese Weise zentralisieren wir die wiederholte Validierungslogik erfolgreich in einer Methode. Wenn die allgemeine Überprüfungslogik geändert oder erweitert werden muss, müssen Sie nur die Methode zur validierten (objectrequest objecrequest) ändern, die die Wartbarkeit und Skalierbarkeit des Codes erheblich verbessert.

Zusammenfassung und Best Practices

Die Verwendung abstrakter Elternklassen zur Optimierung gemeinsamer Methoden ist ein leistungsstarkes Code -Wiederverwendung -Muster in Java. Es funktioniert für die folgenden Szenarien:

  • Mehrere Klassen haben eine große Anzahl der gleichen Felder und Verhaltensweisen : Diese Klassen gehören konzeptionell zur gleichen Klasse von Dingen, haben aber ihre eigenen einzigartigen Eigenschaften.
  • Für diese ähnlichen Klassen sind die gleichen Operationen erforderlich : wie Überprüfung, Serialisierung, Konvertierung usw.

Vorteil:

  • Redundanz reduzieren : Vermeiden Sie es wiederholt, dieselbe Geschäftslogik zu schreiben.
  • Verbesserung der Wartbarkeit : Logische Modifikationen müssen nur an einem Ort vorgenommen werden.
  • Verbesserte Skalierbarkeit : Die neu hinzugefügten ähnlichen Anforderungstypen können automatisch allgemeine Verarbeitungsleistung durch Erben der abstrakten übergeordneten Klasse erhalten.
  • Verbesserung der Lesbarkeit : Die Codestruktur ist klarer und die Absicht ist klarer.

Anmerkungen:

  • Überstrakt : Wenn es nur sehr wenige gemeinsame Punkte zwischen Klassen gibt oder wenn nicht verwandte Klassen zusammengezwungen werden, können dies zu einer Überkomplexdesign führen und die Lesbarkeit verringern.
  • Vererbungsbeschränkungen : Java ist eine einzige Erbschaftssprache. Wenn eine Klasse andere Klassen geerbt hat, kann sie die allgemeine Logik nicht durch Erbschaft wiederverwenden. Zu diesem Zeitpunkt können Sie in Betracht ziehen, Schnittstellen mit Standardmethoden, Kombinationsmustern oder anderen Entwurfsmustern wie Generika zu kombinieren.
  • Einschränkungen des Datensatztyps : Der Datensatztyp wurde in Java 16 eingeführt. Sein Entwurfsziel ist es, ein unveränderlicher Datenanbieter zu sein und andere Klassen nicht zu erben (kann aber Schnittstellen implementieren). Wenn Sie also den Polymorphismus mit Vererbung implementieren müssen, müssen Sie möglicherweise die Aufzeichnungen in die herkömmliche Klasse umwandeln.

Indem Entwickler rational mit Abstraktion und Vererbung rational unter Verwendung von Abstraktion und Vererbung mehr eleganter, robuster und einfacher schreiben, um den Java -Code aufrechtzuerhalten.

Das obige ist der detaillierte Inhalt vonJava Allgemeine Methodenoptimierung: Verwenden der abstrakten übergeordneten Klasse, um ähnliche Anforderungsobjekte zu verarbeiten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Stock Market GPT

Stock Market GPT

KI-gestützte Anlageforschung für intelligentere Entscheidungen

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

So erstellen Sie eine Datei in Java So erstellen Sie eine Datei in Java Sep 21, 2025 am 03:54 AM

Usefile

Wie füge ich dem Klassenpfad eine JAR -Datei in Java hinzu? Wie füge ich dem Klassenpfad eine JAR -Datei in Java hinzu? Sep 21, 2025 am 05:09 AM

Verwenden Sie den Parameter -cp, um das JAR zum Klassenpfad hinzuzufügen, damit das JVM seine internen Klassen und Ressourcen laden kann, wie z.

Wie implementiere ich eine Schnittstelle in Java? Wie implementiere ich eine Schnittstelle in Java? Sep 18, 2025 am 05:31 AM

Verwenden Sie das Keyword implementiert die Benutzeroberfläche. Die Klasse muss spezifische Implementierungen aller Methoden in der Schnittstelle bereitstellen. Es unterstützt mehrere Schnittstellen und wird von Commas getrennt, um sicherzustellen, dass die Methoden öffentlich sind. Die Standard- und statischen Methoden nach Java 8 müssen nicht umschreiben.

Wie lese ich eine Eigenschaftendatei in Java? Wie lese ich eine Eigenschaftendatei in Java? Sep 16, 2025 am 05:01 AM

Verwenden Sie die Eigenschaftenklasse, um Java -Konfigurationsdateien einfach zu lesen. 1. Konfiguration. Properties in das Ressourcenverzeichnis, laden Sie es über getClassLoader (). GetResourceAsStream () und rufen Sie die Methode load () auf, um die Datenbankkonfiguration zu lesen. 2. Wenn sich die Datei in einem externen Pfad befindet, verwenden Sie sie mit FileInputStream, um sie zu laden. 3. Verwenden Sie GetProperty (Schlüssel, StandardValue), um fehlende Tasten zu verarbeiten und Standardwerte bereitzustellen, um die Ausnahmeregelung und Eingabeüberprüfung sicherzustellen.

Erstellen erweiterbarer Anwendungen mit der Java Service Provider Interface (SPI) Erstellen erweiterbarer Anwendungen mit der Java Service Provider Interface (SPI) Sep 21, 2025 am 03:50 AM

Javaspi ist ein integrierter Service-Erkennungsmechanismus in JDK und implementiert die dynamische Ausdehnung der interface-orientierten Dynamik durch Serviceloader. 1. Definieren Sie die Serviceschnittstelle und erstellen Sie eine Datei mit dem vollständigen Namen der Schnittstelle unter meta-inf/diensten/und schreiben Sie den vollständig qualifizierten Namen der Implementierungsklasse. 2. Verwenden Sie Serviceloader.load (), um die Implementierungsklasse zu laden, und das JVM wird die Konfiguration automatisch lesen und sie instanziieren. 3. Der Schnittstellenvertrag sollte während des Entwurfs, der Unterstützung von Priorität und bedingten Belastung geklärt und die Standardimplementierung bereitstellen. 4. Die Anwendungsszenarien umfassen Mehrzahler-Kanalzugriff und Plug-in-Überprüfung. 5. Achten Sie auf Leistung, Klassenpfad, Ausnahme -Isolation, Thread -Sicherheit und Versionskompatibilität; 6. In Java9 kann die Bereitstellung in Kombination mit Modulsystemen verwendet werden.

Ein tiefes Verständnis von HTTP -anhaltenden Verbindungen: Richtlinien und Praktiken zum Senden mehrerer Anfragen auf demselben Sockel Ein tiefes Verständnis von HTTP -anhaltenden Verbindungen: Richtlinien und Praktiken zum Senden mehrerer Anfragen auf demselben Sockel Sep 21, 2025 pm 01:51 PM

In diesem Artikel wird der Mechanismus des Sendens mehrerer HTTP-Anfragen auf demselben TCP-Socket, nämlich die persistierende HTTP-Verbindung (Keep-Alive), eingehend untersucht. Der Artikel verdeutlicht den Unterschied zwischen HTTP/1.x- und HTTP/2-Protokollen, unterstreicht die Bedeutung der serverseitigen Unterstützung für anhaltende Verbindungen und wie die Verbindung korrekt behandelt wird: die Header der Antwort schließen. Durch die Analyse gemeinsamer Fehler und Bereitstellung von Best Practices möchten wir Entwicklern helfen, effiziente und robuste HTTP -Kunden aufzubauen.

Java -Tutorial: Wie man eine verschachtelte Arraylist überflätt und ihre Elemente in ein Array füllt Java -Tutorial: Wie man eine verschachtelte Arraylist überflätt und ihre Elemente in ein Array füllt Sep 18, 2025 am 07:24 AM

In diesem Tutorial wird beschrieben, wie verschachtelte Arraylisten effizient verarbeitet werden können, die andere Arraylisten in Java enthalten und alle seine internen Elemente in ein einzelnes Array verschmelzen. Der Artikel bietet zwei Kernlösungen durch den Flatmap -Betrieb der Java 8 -Stream -API: Zuerst in eine Liste und dann das Ausfüllen des Arrays und das direkte Erstellen eines neuen Arrays, um die Anforderungen verschiedener Szenarien zu erfüllen.

Java Generics und Wildcards verstehen Java Generics und Wildcards verstehen Sep 20, 2025 am 01:58 AM

Javagenericsprovidecompile-timetypesafetyandeliminatecastingbyallowingtypeparametersonclasses,interfaces,andmethods;wildcards(?,?extendsType,?superType)handleunknowntypeswithflexibility.1.UseunboundedwildcardwhentypeisirrelevantandonlyreadingasObject

See all articles