最近在写一个手机小应用系统的业务模块有一些对抽象和接口的规划主要是接口部分通常状况下同类或同性质的事物咱们都会将其抽离实现接口统一以便业务实现节环更灵活地使用。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 } }