2016-11-09 3 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

ya иногда не имеет никакого смысла, но может быть полезен для настройки –

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 { 

, который имеет много пустых реализации. Таким образом, вместо реализации интерфейса вы можете расширить адаптер и только переопределить методы, которые вам действительно интересны, без добавления пустых реализаций для всех тех методов, которые вам даже не нужны.

Это делает намного более удобные и компактные реализации.

Смежные вопросы