Heim  >  Artikel  >  Java  >  Detailliertes Beispiel für die Definition abstrakter Eigenschaften in Java

Detailliertes Beispiel für die Definition abstrakter Eigenschaften in Java

黄舟
黄舟Original
2017-08-20 09:40:301718Durchsuche

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!

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