どのように徹底的に他の人があなたの類を使うことを根絶します


今日eclipseソースでこれを発見しました.
と書く
transactionLock.new Access() {/*empty block*/}.transfer(owner);
[org.eclipse.emf.transaction.impl.TransactionalEditingDomainImpl 814行]transactionLockはロッククラスの一例である
第一眼はかなり怪しげに見え、多くの文法特性(内部クラスが外部でインスタンス化する方法、内部クラスの使用、抽象クラスなど)を用いている.ついでに、著者の真意を発見した.ロックのコードを見てみよう.コードは大体以下の通りである.
class Lock{
     public abstract class Access {
  /**
   * Initializes me.
   */
  protected Access() {
   checkSubclass();
  }
  
  /**
   * Transfers the lock's ownership to the specified thread.
   * 
   * @param thread the new owner thread
   */
  public void transfer(Thread thread) {
   Lock.this. transfer(thread);
  }
  
  private void checkSubclass() {
   String name = getClass().getName();
   String packageName = name.substring(0, name.lastIndexOf('.') + 1);
   
   if (!"org.eclipse.emf.transaction.impl.".equals(packageName)) { //$NON-NLS-1$
    throw new IllegalArgumentException("Illegal subclass"); //$NON-NLS-1$
   }
  }
 }
 //other methods,properties,inner class code 
 }

このクラスの内部クラスAccessは抽象クラスであることがわかりますが、抽象的な方法はありません.これはかなり奇妙です.このabstractは何の役に立ちますか?abstractを通過した後、他の人はこのクラスを直接インスタンス化することはできません.もちろんprivateクラスやコンストラクション関数でこの効果を達成することはできますが、自分が他の場所ではこのクラスを使うことはできません.また、構造関数でcheckSubclassメソッドが呼び出されているのを見ることができ、このパッケージでサブクラスのパッケージ名がorgであるかどうかを確認することができます.eclipse.emf.transaction.impl、そうでなければ異常を投げ出して、このパッケージのクラスだけがこのクラスをサブクラス化できることを制限します.このように徹底的に他の人がこの類を使う可能性を根絶しました:1、類を抽象的に定義して、他の人が直接インスタンス化することを根絶します2、構造関数でこの子類のパケットがAccessと1つのパケットであるかどうかを判断します