2016-11-09 222 views
1

我讀一些源代碼,想不通爲什麼在一個抽象類中的兩個非抽象空法的含義。什麼非抽象空洞的方法,抽象類

抽象類是這樣的:

public abstract class AbstractMode extends TimerTask{ 

    abstract public void initial(); 

    abstract public int getAllConsumption(); 

    public void checkTemperature(int currentTem) {}; 

    public void checkConsumption() {}; 

    abstract public long updateHistory(); 

    abstract public void updateMYSQLCurrentDevice(int counter); 
} 

它只有一個是具體的類重寫,並使用它們,但我可以直接實現在具體的類權這些方法?所以我想知道他們是否可以起飛,他們有什麼用處?

+0

如果你想提供任何默認的實現,你可以在這裏提供它,這樣多個具體的類不會有重複的代碼。 –

+1

誠實地說,在我眼裏有非(如果它們是空的) – SomeJavaGuy

+0

抽象類中的非抽象方法通常通過因式分解具體類的代碼而出現。我懷疑這是從這樣得到的。 –

回答

3

對我來說這是一種代碼味道。原因如下:

  1. 如果這些方法的目的是什麼都不做,爲什麼它們存在?
  2. 如果他們打算定義一個行爲,他們將有一個實現(非空),並將作出final來表達該意圖。
  3. 如果他們打算被覆蓋,意圖顯然不是 表示,因爲沒有人會有線索,這些方法必須覆蓋 ,因此應該作出abstract

要擺脫這種氣味,我會刪除它們或使它們abstract

+0

抽象類可以有抽象方法或非抽象方法也 –

+0

@DhavalJoshi的確,它可以。但我認爲**抽象**類具有**非抽象**方法**代碼氣味**。 – Spotted

+0

是的,這就是爲什麼投票兄弟 –

1

它到底是什麼,如果空的方法有一些代碼。這些方法被視爲已實施。由於只有一個具體類實現這個抽象類,所以空方法是沒有意義的。

+0

雅有時沒有任何意義,但可以用於定製 –

1

雖然不是最常見的情況,有時是在模板方法的上下文中得心應手。在這種情況下,有一種方法定義流程,將某些部分的具體實現留給它的子類。在某些情況下,默認的具體表現是什麼也不做,

通過重寫它

留在基類的具體方法爲空,但允許在子類中 定製。

1

這對於覆蓋的東西是可選的情況下非常有用。例如,在java.awt.event,有一個接口:

public interface MouseListener extends EventListener { 
    public void mouseClicked(MouseEvent e); 
    public void mousePressed(MouseEvent e); 
    public void mouseReleased(MouseEvent e); 
    public void mouseEntered(MouseEvent e); 
    public void mouseExited(MouseEvent e); 
} 

,然後有一個抽象類:

public abstract class MouseAdapter implements MouseListener, MouseWheelListener, MouseMotionListener { 

具有充足空實現的。因此,您可以擴展適配器,而不是實現接口,而只是重寫您實際感興趣的方法,而無需爲所有您不關心的方法添加空實現。

這使得更漂亮,更緊湊的實現。