Не виртуальные методы в Java - PullRequest
       7

Не виртуальные методы в Java

8 голосов
/ 01 сентября 2010

Просто начинаю использовать Java. Я нахожу много общего с .NET, но вижу, что все методы в Java являются виртуальными по умолчанию. Итак, вопрос в том, что я могу сделать, чтобы они не были виртуальными? Является ли ключевое слово final единственным и правильным решением?

Ответы [ 4 ]

8 голосов
/ 01 сентября 2010

Да, или личное

6 голосов
/ 01 сентября 2010

Если вы стремитесь сделать метод не виртуальным для повышения производительности, дайте JIT справиться с этим до тех пор, пока у вас не появятся доказательства того, что он этого не делает.

Если причина сделать метод неВиртуальный - это возможность определять его в подклассе, но не включать полиморфизм, вы, вероятно, создаете подклассы без какой-либо реальной причины (опубликуйте больше кода, если хотите оспорить это).Я бы посоветовал сделать окончательный класс вместо отдельных методов, если это возможно.У ИДЕИ есть хорошие проверки для дизайна класса.Постарайтесь не прислушиваться к тем, кто хочет, чтобы вы оставили все открытым, чтобы они могли подклассы взломать ошибки или ограничения;они будут кричать на вас еще громче, когда вы случайно нарушите их подкласс.

Предоставьте клиентам возможность добавлять свои собственные типы вместо ваших подклассов, и они, вероятно, даже не заметят, что ваши классы являются окончательными.

2 голосов
/ 01 сентября 2010

Вместо того, чтобы определять все методы как финальные, вы также можете определить весь класс как финальный.Я не говорю, хороший это или плохой стиль.

1 голос
/ 26 января 2014

Сделайте это статичным.

Если вы вызываете не виртуальный метод, вы хотите узнать из своего кода, какой метод класса вы вызываете. Недостаток .net в том, что вы не можете узнать это из своего кода.

Пример

В Java, если вы определите ClassB как

public class ClassB extends ClassA {
    @Override 
    public void run() {
    }
}

и объект

ClassA obj=new ClassB();

Если вы вызовете obj.run (), как вы узнаете, соответствует ли этот код правилам полиморфного принципа открытия / закрытия или он будет кодировать метод, связанный с ClassA? В Java вы будете знать, что всегда есть полиморфизм. Проще делать макеты, проще расширять классы и следовать принципу подстановки Лискова.

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

public static run(ClassA obj)

и вы можете позвонить с

ClassB obj=new ClassB();
ClassA.run(obj);

и из кода вы узнаете, что вызываемый вами метод определен в ClassA, а не в ClassB.

...