天天看點

大話Java中的接口

發現最近大家都為了所謂的相容性和擴充性都在濫用接口,現在大話下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的,

自己調用,不需要維護。

強烈建議慎用接口