2016-10-21 4 views
0

Давайте предположим, что у меня есть следующие классы:Как избежать избыточного кода для статических методов

public class Cat { 
    private final String noise = "meow"; 

    pulic static void makeNoise(){ 
     System.out.println(noise); 
    } 
} 

public class Dog { 
    private final String noise = "woof"; 

    pulic static void makeNoise(){ 
     System.out.println(noise); 
    } 
} 

Как вы можете видеть, эти два класса разделяют почти один и тот же код. Для удаления избыточного кода, я бы создать родительский класс вроде этого:

public abstract class Animal { 
    protected final String noise; 

    public Animal(String noise) { 
     this.noise = noise; 
    }  

    public void makeNoise() { 
     System.out.println(noise); 
    } 
} 

public class Dog extends Animal{ 
    public Dog(){ 
     super("woof"); 
    } 
} 

Сейчас, к сожалению, я бегу в две проблемы:

  1. Поскольку шуметь животного не может быть статичным больше , так как константы должны быть назначены через конструктора животного, вам необходимо создать кошку или собаку, чтобы получить шум этого животного. Даже , хотя он постоянный.
  2. Метод makeNoise() должен работать в классе Animal - у нет шума по умолчанию.

Возможное решение могло бы быть чем-то вроде линии: public abstract void makeNoise(); , который не разрешен, и не стирает необходимость скопировать код в каждого и каждого из детей Animal.

Как бы вы устранили необходимость иметь избыточный код у детей животных, сохраняя при этом метод makeNoise static?

+0

Ваш код не компилируется. Непонятно, почему вы хотите сохранить метод 'static'. Неясно, что вы спрашиваете. – EJP

+0

@ saka1029 Редактировать Отклонено. Не подходите к выводам. – EJP

+0

@EJP Приведенный выше код является упрощенной версией математического класса. Этот класс содержит множество _функций_ для вычисления некоторых значений. Поскольку метод makeNoise() необходим для большинства этих функций, я почувствовал необходимость добавления статичного modifiert. Фактические дети этого класса добавляют некоторые дополнительные функции и имеют собственное значение для постоянного шума: –

ответ

1

Статические методы в Java не могут быть переопределены в подклассах.

Если вы определяете статический метод в подклассе с той же сигнатурой, что и статический метод в родительском классе, метод не переопределяет родительский метод, он скрывает его. Методы родительского и дочернего классов не имеют отношения друг к другу.

В вашем примере, если метод static void makeNoise() существует в Animal и любом подкласс определяет метод, а также подкласс просто скрывает метод makeNoise в животных.

В вашем примере, лучшее, что вы можете сделать со статическими методами является:

public static void makeNoise(String noise) { 
    System.out.println(noise); 
} 

и вызывать метод так:

Animal.makeNoise(Cat.NOISE); // A constant NOISE is defined in each subclass 

Если метод makeNoise не является статичным, наследование может используются для использования другого шума в каждом подклассе:

public abstract class Animal { 
    protected String noise; 

    protected Animal(String noise) { 
     this.noise = noise; 
    } 

    public void makeNoise() { 
     System.out.println(noise); 
    } 

} 

public class Cat extends Animal{ 
    public static final String NOISE = "meow"; 

    public Cat() { 
     super(NOISE); 
    } 
} 
+0

Ну, это не то, на что я надеялся, но, по крайней мере, теперь я знаю, как идти. Спасибо! –

0

Зачем вам представляют поведение объекта реального мира со статическим методом? У каждого животного есть свое поведение, поэтому вы хотите различать их.

enum AnimalBehavior { 
    MEOW, WOOF, ROAR 
} 

Вы можете использовать перечисление, содержащее каждое поведение животных. Также рассмотрим следующую ситуацию: Волк продолжает вопить в полнолунную ночь. Он продолжает это делать, пока не исчерпает себя. Вы хотите отслеживать бар, который указывает уровень энергии вашего волка.

private int energy = 100; 

public static void wolfHowl() { 
    System.out.println(AnimalBehavior.ROAR); 
    energy = energy - 10; 
} 

Это не будет работать, потому что технически вы используете статические методы .. так что имейте в виду, как вы проектируете свой материал так, что волк действительно может выть, не уставая, пока кто-то не получает действительно разозлился.