ホームページ  >  記事  >  Java  >  Java で抽象プロパティを定義する詳細な例

Java で抽象プロパティを定義する詳細な例

黄舟
黄舟オリジナル
2017-08-20 09:40:301703ブラウズ

この記事では、主に Java での抽象属性の定義方法に関する関連情報を紹介します。必要な方は参照してください。

はじめに

この記事では、主に Java での定義について紹介します。抽象属性は、すべての人の参照と学習のために共有されます。以下では多くは言いませんが、詳細を見てみましょう:

抽象キーワードは、通常、特定の動作を実装するためにクラスとメソッドで使用されます。 Java は抽象プロパティをサポートしていないため、クラス プロパティを抽象としてマークしようとするとコンパイル時エラーが発生します。

このチュートリアルでは、Abstract キーワードを使用せずにサブクラスによって設定できる抽象プロパティを定義する 2 つの方法を紹介します。

実際的なケース

特定のトランザクション情報を記録するトランザクション ログ モジュールを実装したいとします。ファイルやデータベースへのログ記録など、さまざまなログ記録方法を実装できるように、このモジュールを抽象化したいと考えています。

私たちのエンジンは、事前定義された区切り文字を使用してログ内の情報を連結し、それを文字列に保存します。どの区切り文字を使用するかは、ログ ルールによって異なります。たとえば、文字「,」を使用して、ログ レコード内の情報の異なる部分を区切ることができます。

そのため、区切り文字はエンジンにとって抽象的なものであるように見え、各ロギング ルールによって明示的に定義する必要があります。

以下に、セパレータの定義をサブクラスに委任する 2 つの方法を示します。

抽象クラスでパラメーター化されたコンストラクターを定義する

抽象クラスで動的プロパティを定義する最初の方法は、パラメーター化されたコンストラクターを定義することです。

したがって、このエンジンは次のように実装できます:


// 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() を呼び出すことが強制されます。 。 このようにして、セパレータ属性を使用中のロギング メカニズムに依存させることができます。 super() 。 这样我们就能强制separator属性依赖于已使用的日志记录机制。

注意:我们的引擎实现了所有日志机制共有的静态行为:startTransaction() , endTransaction() ,同时将动态行为writeTransaction()

注:

私たちのエンジンは、すべてのログ記録メカニズムに共通の静的動作を実装しています: startTransaction()endTransaction() code> を実行し、同時に動的動作 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 !!

ゲッターメソッドを介して区切り文字を渡す

動的プロパティを実装する別の方法は、抽象ゲッターメソッドを定義することです。これは、現在のロギングメカニズムに基づいて、必須の区切り文字。私たちのエンジンでは、区切り文字が必要な場合、このゲッター メソッドを呼び出すことで区切り文字を取得できます。

次に、エンジンを次のように変更します:


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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。