關於JAVA中的Synchronization和interface誤用

最近在寫一個手機小應用系統的業務模塊有一些對抽象和接口的規劃主要是接口部分一般情況下同類或同性質的事物我們都會將其抽離實現接口統一以便業務實現節環更靈活地使用。


課題如下

  在interface中聲明 Synchronization 描述的方法是否可行要如何做


實際上Java 1.2以前的版本是允許這麼做的

public interface DemoInterface{
    synchronization void function1();
}

然而1.2以後的版本就不行了且這麼做是是錯誤的。接口(interface)就如其名一樣只是“ 它們都是電梯”的標記但無論是使用方法還是物理構造都不一定是一樣的即使開啓的方法是同一個按鈕但實現僅僅是同一個長得像或同叫一個名爲“開關”的按鈕就能啓動而已。因此接口的意義就在於讓人們不需要了解過多的細節而只需知道一個純粹的作用---“開啓”就行了。


說到這裏可能會有鞋童問那抽象類Abstract class的用途跟接口有何區別事實上這要看你如何系統規劃來決定何時、何地使用Abstract 或 interface的話題了。簡單的解釋有共同且一致的基本實現時使用Abstract這樣實現類少一些代碼編寫量團隊分工也容易維護也可控等等而需要照顧到更廣泛的用途時且沒有必要規定實現類的基本形態的情況使用interface最佳。


回到正題我的需求是有若干個算法實現它們有共同的使用入口接口 interface但不是所有實現都需要考慮線程同步當然也可以統一要求線程同步這時你會發現直接寫一個抽象類讓它們繼承就行了正如前面的訴求只是入口相同即使用參列一致但實現方式不一定相同或部分同接口名稱 卻不需要線程同步的情況。

如下

public abstract DemoAbstract{
     synchronization void function1();
     synchronization boolean function2(){
         // ToDo
         .......
     }
 }
 
或者

public interface DemoInterface{
    synchronization void function1();
}

如果這麼聲明這是否正確先不說首先就已經違背了抽象思想吧我們這麼做跟在抽象中就規定好它們的實現約定有什麼區別不如直接寫實現類好了沒有必要再抽象你說對嗎


在翻閱一些資料中找到了如下說明

Although the synchronized keyword can appear in a method header, it does not form a part of a method's API or contract. Synchronization is part of the implementation, not part of the interface.


關鍵的是紅底部分文字這時說明了一切synchronization 應該是在實現類中使用於修飾具體的實現方法的而不應該在接口中。


以下附上一個樣子供大家及自己複習

// 接口 
public interface ScientificTheory {  
  void publish();  
  void predict();  
  boolean falsifyThroughMeasurement();
  
}
// 實現類 LoopQuantumGravity1
public final class LoopQuantumGravity2 implements ScientificTheory {
  @Override
  public synchronized void publish() {    //..elided  }  
  
  @Override // 需要線程同步
  public synchronized void predict() {    //..elided  } 
   
  @Override 
  public boolean falsifyThroughMeasurement() {    return true; //stub 
  }
  
}
// 實現類 LoopQuantumGravity2
public final class LoopQuantumGravity2 implements ScientificTheory {  
  @Override 
  public synchronized void publish() {    //..elided  } 
   
  @Override //不需線程同步
  public void predict() {    //..elided  }
    
  @Override
  public boolean falsifyThroughMeasurement() {    return true; //stub 
  }
  
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章