關於JAVA中的Synchronization和interface誤用

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


課題以下算法

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


實際上Java 1.2之前的版本是容許這麼作的ide

public interface DemoInterface{
    synchronization void function1();
}

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


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


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

以下orm

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 
  }
  
}
相關文章
相關標籤/搜索