Dieser Artikel führt Sie hauptsächlich in relevante Informationen zum Definieren eines abstrakten Attributbeispiels in Java ein. Freunde, die es benötigen, können darauf verweisen
Vorwort
Dieser Artikel stellt Ihnen hauptsächlich den relevanten Inhalt der Definition eines abstrakten Attributs in Java vor. Ich werde im Folgenden nicht viel sagen, werfen wir einen Blick auf die detaillierte Einführung:
Das Schlüsselwort Abstract wird normalerweise in Klassen und Methoden verwendet, um die Implementierung bestimmter Verhaltensweisen an Unterklassen zu delegieren. Da Java keine abstrakten Eigenschaften unterstützt, erhalten Sie beim Kompilieren einen Fehler, wenn Sie versuchen, eine Klasseneigenschaft als abstrakt zu markieren.
In diesem Tutorial stellen wir zwei Methoden zum Definieren abstrakter Eigenschaften vor, die von Unterklassen ohne Verwendung des Schlüsselworts „Abstract“ festgelegt werden können.
Praktischer Fall
Angenommen, wir möchten ein Transaktionsprotokollmodul implementieren, um bestimmte Transaktionsinformationen aufzuzeichnen. Wir möchten, dass dieses Modul abstrakt ist, damit wir verschiedene Protokollierungsmethoden implementieren können, beispielsweise die Protokollierung in einer Datei oder Datenbank.
Unsere Engine verwendet vordefinierte Trennzeichen, um die Informationen im Protokoll zu verketten und in einem String zu speichern. Welches Trennzeichen verwendet werden soll, hängt von den Protokollierungsregeln ab. Beispielsweise kann das Zeichen „“ verwendet werden, um verschiedene Teile der Informationen im Protokolldatensatz zu trennen.
Daher scheinen Trennzeichen für unsere Engine abstrakt zu sein und müssen in jeder Protokollierungsregel explizit definiert werden.
Im Folgenden stelle ich zwei Möglichkeiten vor, die Definition von Trennzeichen an Unterklassen zu delegieren.
Konstruktor mit Parametern in abstrakter Klasse definieren
Die erste Möglichkeit, dynamische Eigenschaften in abstrakter Klasse zu definieren, ist: Definieren Sie einen Konstruktor mit ein Parameter.
So können wir diese Engine wie folgt implementieren:
// TransactionManager.java public abstract class TransactionManager { private String separator; public TransactionManager(String separator) { this.separator = separator; } public abstract void writeTransaction(String result); public Transaction startTransaction() { Transaction transaction = new Transaction(System.currentTimeMillis()); return transaction; } public void endTransaction(Transaction t) { long processingTime = System.currentTimeMillis() - t.getStartTime(); StringBuilder logBuilder = new StringBuilder(); logBuilder.append(t.getStartTime()); // Notice the use of this.separator logBuilder.append(this.separator); logBuilder.append(processingTime); logBuilder.append(this.separator); logBuilder.append(t.getData()); String result = logBuilder.toString(); writeTransaction(result); } }
Wenn Sie einen Konstruktor mit Parametern in einer abstrakten Klasse definieren, werden Unterklassen gezwungen, Ihre zu definieren Eigener Konstruktor und Aufruf super()
. Auf diese Weise können wir erzwingen, dass das Trennzeichenattribut vom verwendeten Protokollierungsmechanismus abhängt.
Hinweis: Unsere Engine implementiert die statischen Verhaltensweisen, die allen Protokollierungsmechanismen gemeinsam sind: startTransaction()
, endTransaction()
, während das dynamische Verhalten writeTransaction()
der Unterklasse überlassen wird umzusetzen.
Wenn wir nun einen Transaktionsmanager erstellen und damit den Protokollinhalt in einer Datei aufzeichnen möchten, können wir ihn wie folgt definieren:
public class TransactionManagerFS extends TransactionManager{ // The IDE forces you to implement constructor. public TransactionManagerFS(String separator) { super(separator); } @Override public void writeTransaction(String result) { System.out.println("The following transaction has just finished: " ); System.out.println(result); } }
Führen Sie als Nächstes einen Test durch, um zu sehen, wie der Code funktioniert
public static void main(String[] args) throws InterruptedException { // we pass the separator explicitly in the constructor TransactionManager transactionManager = new TransactionManagerFS(","); Transaction transaction = transactionManager.startTransaction(); transaction.setData("This is a test transaction !!"); Thread.sleep(1500); transactionManager.endTransaction(transaction); }
Ausgabe:
The following transaction has just finished: 1502179140689,1501,This is a test transaction !!
Übergeben Sie das Trennzeichen durch die Getter-Methode
Eine andere Möglichkeit, dynamische Eigenschaften zu implementieren, besteht darin, eine abstrakte Getter-Methode zu definieren, die Methode zum Abrufen der erforderlichen Trennzeichen basierend auf dem aktuellen Protokollierungsmechanismus. Wenn in unserer Engine ein Trennzeichen benötigt wird, kann es durch Aufrufen dieser Getter-Methode abgerufen werden.
Als nächstes modifizieren wir die Engine wie folgt:
public abstract class TransactionManager { public abstract String getSeperator(); public abstract void writeTransaction(String result); public Transaction startTransaction() { Transaction transaction = new Transaction(System.currentTimeMillis()); return transaction; } public void endTransaction(Transaction t) { long processingTime = System.currentTimeMillis() - t.getStartTime(); StringBuilder logBuilder = new StringBuilder(); logBuilder.append(t.getStartTime()); // Notice the use of getSeparator() logBuilder.append(getSeperator()); logBuilder.append(processingTime); logBuilder.append(getSeperator()); logBuilder.append(t.getData()); String result = logBuilder.toString(); writeTransaction(result); } }
Zusätzlich modifizieren wir TransactionManagerFS wie folgt:
public class TransactionManagerFS extends TransactionManager{ @Override public String getSeperator() { return ","; } @Override public void writeTransaction(String result) { System.out.println("The following transaction has just finished: " ); System.out.println(result); } }
Ändern Sie dann „main“, um die neue Implementierung zu verwenden, und stellen Sie sicher, dass Sie die richtigen Ergebnisse erhalten.
public static void main(String[] args) throws InterruptedException { // The separator is defined implicitly using getSeparator() method of the manager TransactionManager transactionManager = new TransactionManagerFS(); Transaction transaction = transactionManager.startTransaction(); transaction.setData("This is a test transaction !!"); Thread.sleep(1500); transactionManager.endTransaction(transaction); }
Ausgabe:
The following transaction has just finished: 1502179140689,1501,This is a test transaction !!
Zusammenfassung
Das obige ist der detaillierte Inhalt vonDetailliertes Beispiel für die Definition abstrakter Eigenschaften in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!