發現最近大家都為了所謂的相容性和擴充性都在濫用接口,現在大話下Java中的接口。
首先對java中的接口進行分類
1.标示性接口
常見的如下:
序列化接口
public interface Serializable {
}
可疊代接口:
public interface Iterable<T> {
/**
* Returns an iterator over a set of elements of type T.
*
* @return an Iterator.
*/
Iterator<T> iterator();
}
比較接口:
public interface Comparable<T> {
public int compareTo(T o);
}
2.功能性接口
此類接口最為常見,也是我們在使用中最濫用的一部分,常見如下:
Map接口:
public interface Map<K,V> {
int size();
boolean containsKey(Object key);
............
}
List接口:
public interface List<E> extends Collection<E> {
int size();
boolean isEmpty();
......
}
3.常量型接口
此類接口一般是一些靜态常量,常見如下:
cookie policy接口:
public interface CookiePolicy {
/**
* One pre-defined policy which accepts all cookies.
*/
public static final CookiePolicy ACCEPT_ALL = new CookiePolicy(){
public boolean shouldAccept(URI uri, HttpCookie cookie) {
return true;
}
};
/**
* One pre-defined policy which accepts no cookies.
*/
public static final CookiePolicy ACCEPT_NONE = new CookiePolicy(){
public boolean shouldAccept(URI uri, HttpCookie cookie) {
return false;
}
};
......
}
其次我們羅列下我們常犯的錯誤
1.接口中未定義的方法在實作類中調用
public interface ITest{
boolean isTest();
}
實作類:
public class Test implements ITest{
@Override
public boolean isTest() {
return false;
}
public boolean isOk(){
return true;
}
}
調用:
public class MainTest{
private ITest test=new Test();
public void test(){
(Test)test.isOk();
}
}
既然你非要調用為啥不在接口中聲明了,如果是自己獨特的方法那麼接口設計就出了問題,自己獨特的方法也應該是private的,然後在isTest()中調用,正确做法如下:
修改接口聲明:
public interface ITest{
boolean isTest();
boolean isOk();
}
2.接口中未聲明的方法在實作類中public出來了,舉例如下:
接口:
public interface ITest{
boolean isTest();
}
實作類:
public class Test implements ITest{
@Override
public boolean isTest() {
return isOk();
}
public boolean isOk(){
return true;
}
}
調用:
public class MainTest{
private ITest test=new Test();
public void test(){
test.isTest();
}
}
暴露出來的方法就要維護,參數為接口型的那麼這種接口未聲明的方法沒有辦法給外界調用,是以應該修改成private的,
自己調用,不需要維護。
強烈建議慎用接口