关于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 
  }
  
}
时间: 2024-08-04 14:07:20

关于JAVA中的Synchronization和interface误用的相关文章

`Java`中`abstract class`与`interface`区别

abstract class Java中允许使用abstract修饰符声明方法,此时只定义方法但是不实现方法(abstract修饰的方法没有主体,只有一个签名和一个分号). 以下是abstract方法和这些方法所在的abstract类相关的规则: 只要类中有一个abstract方法,那么这个类本身就自动成为abstract,而且必须声明为abstract class,否则会导致编译错误; abstract class无法实例化; abstract类的子类必须覆盖超类的每个abstract方法,并

Java中abstract class 和 interface 的解释和他们的异同点(转)

(一)概述    在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制.正是由于这两种机制的存 在,才赋予了Java强大的 面向对象能力.abstract class和interface之间在对于抽象类定义的支持方面具有 很大的相似性,甚至可以相互替换,因此很多开发者在进 行抽象类定义时对于abstract class和interface的 选择显得比较随意.其实,两者之间还是有很大的区别的,对于它们的选择甚至反映出对 于问题领域本质的理 解.对于设

Java中为什么有abstract interface 修饰类?

如果有人问你为什么有abstract interface 修饰类,答案一定是他看到的这种方式一定是反编译出来的结果.实际中abstract interface和interface修饰的类没有区别. 下面就上面的问题,介绍下抽象接口的概念. 在程序设计过程中,读者很可能遇到这样一种困境:设计了一个接口,但实现这个接口的子类并不需要实现接口中的全部方法,也就是说,接口中的方法过多,对于某些子类是多余的,我们不得不浪费的写上一个空的实现. 今天小菜提到的“抽象接口”,就是用来解决这个问题的. 为了不误

Java中的Map 笔记

Map是Java中的接口 public interface Map<K,V> Map.Entry是Map的一个内部接口 interface Entry<K,V> {} Map提供了一些常用的方法,如keySet() , values,entrySet() 等方法 keySet() 方法返回的是Map中Key值的集合  而entrySet()返回的也是一个Set集合但是集合类型为Map.Entry<K,V> Set<Map.Entry<K, V>>

java中的解耦是什么意思

这是形象搞笑的比喻:完全可以这么想像嘛,有一对热恋中的男女,水深火热的,谁离开谁都不行了,离开就得死,要是对方有一点风吹草动,这一方就得地动山摇.可以按照琼瑶阿姨的路子继续想象,想成什么样都不过分,他们之间的这种状态就应该叫做"偶合".他们这么下去,有人看不惯了,有一些掌握话语权的权利机构觉得有必要出面阻止了,这样下去不是个事吖,你得先爱祖国,爱社会,爱人民,爱这大好河山才行啊,于是棒打鸳鸯,让他们之间对对方的需要,抽象成一种生理需要,这就好办了,把她抽象成女人,他抽象成男人,当他需要

java中的接口interface

关于接口 接口描述了实现了它的类拥有什么功能.因为Java是强类型的,所以有些操作必须用接口去约束和标记.接口作为类的能力的证明,它表明了实现了接口的类能做什么. 接口中的成员 接口中的所有的成员,缺省情况下都是public的,也必须是public,无论是方法,还是字段.因为接口就是规定了API,如果实现的类不公开接口中的API,怎么能叫API呢? 接口中可以 定义方法 和 字段. 接口中的字段,缺省(也是必须)为 public static final  .在定义的接口中必须初始化,因为是fi

OC中的@interface和java中的区别以及 @implementation @protocol

java 在java中的interface是‘接口’的意思,而java的类声明用class,即接口用interface声明,类是用class声明,是两个独立的部分. 只有在类声明要实现某个接口时,他们两者才建立了关系,例如: [html] view plaincopyprint? interface AI{ void print(); }; class AC{ }; 这时候,AI和AC是独立存在,AC不会因为没有和AI建立关系而编译错误,将AC做以下修改后,AI才和AC建立了关系,AC必须实现A

Java 中 modifer &amp;#39;public&amp;#39; is reduntant for interface methods

http://androidren.com/index.php?qa=322&qa_1=java-%E4%B8%AD-modifer-public-is-reduntant-for-interface-methods 常常会看到接口上写了public修饰方法,然后IDE,比方:Eclipse或者IDEA常常会提示public是多余的.后来就查了一下.java默认接口的方法是public和abstract的,所以真不是必需.同一时候,假设你使用private或者protected都会报错. 所以,

java中interface使用

1.在C++中,类可以多重继承,一个类可以有好几个父类,但是在java中,类是不允许多重继承的,为了多重继承,java中出现了接口(interface)的定义.接口是可以多重继承的,接口的关键词是:interface. 如: 定义接口A: interface A { ... } 定义接口B: interface B { ... } 此时,接口C可以继承A和B: interface C extends  A,B { ... } 同时类也可以同时实现多个接口 如: class Test implem