首頁  >  文章  >  Java  >  Java中定義抽象屬性的範例詳解

Java中定義抽象屬性的範例詳解

黄舟
黄舟原創
2017-08-20 09:40:301719瀏覽

這篇文章主要給大家介紹了關於在java中如何定義一個抽象屬性範例詳解的相關資料,需要的朋友可以參考下

前言

本文主要跟大家介紹的是在java中定義一個抽象屬性的相關內容,分享出來供大家參考學習,下面話不多說了,來一起看看詳細的介紹:

Abstract關鍵字通常被用於類別和方法,用來把某些行為的實作委託給子類別。由於Java不支援抽象屬性,如果你試圖將類別屬性標記為抽象,將會得到一個編譯時錯誤。

在本教程中,我們將介紹兩種定義抽象屬性的方法,這些抽象屬性可以由子類別進行設置,而且不使用Abstract 關鍵字。

實用案例

假設我們想要實作一個記錄交易的日誌模組,用來記錄特定交易的資訊。我們希望這個模組是抽象的,這樣我們可以實作不同的日誌記錄方式,例如:記錄到檔案或資料庫中。

我們的引擎使用預先定義的分隔符號來連接日誌中的信息,並儲存在一個String中。具體應該使用哪個分隔符,這將取決於日誌記錄的規則,例如可以用字元“,”對日誌記錄中不同部分的資訊進行分割。

因此,分隔符號看起來對我們的引擎是抽象的,需要由每個日誌記錄規則明確定義。

下面我提供兩種方式,來實作把分隔符號的定義委託給子類別。

在抽象類別中定義帶參數的建構子

#在抽象類別中定義動態屬性的第一種方法是:定義一個參數的建構函數。

所以我們可以這樣實作這個引擎:


// 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);
 }
}

在抽象類別中定義帶參數的建構子時,子類別將會被強制定義自己的建構子並呼叫super() 。 這樣我們就能強制separator屬性依賴已使用的日誌記錄機制。

注意:我們的引擎實作了所有日誌機制共有的靜態行為:startTransaction() , endTransaction() ,同時將動態行為writeTransaction()交給子類別去實作。

現在,如果我們想要建立一個交易管理器,用它將日誌內容記錄到一個檔案中,那麼可以這樣去定義:


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);
 }
}

接下來做一個測試,看看程式碼是怎麼運作的


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);
 }

輸出:


The following transaction has just finished: 
1502179140689,1501,This is a test transaction !!

透過getter方法傳遞分隔符號

另外一種實作動態屬性的方法是:透過定義一個抽象的getter方法,該方法根據目前的日誌記錄機制來檢索所需的分隔符號。在我們的引擎中,當需要要使用分隔符號時,可以透過呼叫這個getter方法來得到。

接下來我們將引擎修改成這樣:


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);
 }
}

另外修改TransactionManagerFS如下:


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);
 }
}

然後,修改main以使用新的實現,並確保得到正確的結果。


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);
 }

輸出:


#
The following transaction has just finished: 
1502179140689,1501,This is a test transaction !!

總結

########################################################################

以上是Java中定義抽象屬性的範例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn