這篇文章主要給大家介紹了關於在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中文網其他相關文章!