Почему мы не должны вызывать общедоступный метод от другого публичного?

Мне сказал кто-то, что мы не должны вызывать общедоступный метод класса из другого общедоступного метода в том же классе.  Теперь я не могу понять это, так как я не вижу никаких проблем с этим. Как только метод объявлен публичным, его контракт фиксируется на время жизни и, следовательно, не должно быть никаких проблем при вызове его из другого общедоступного метода.

Поэтому я не уверен, что это утверждение истинно или его нормально называть public api из другого публичного api [Это с точки зрения дизайна]?

5
Итак, я не уверен, что это утверждение истинно или его нормально выполните небольшой тест самостоятельно, я думаю, вы сами получите свой ответ, если вы.
добавлено автор subodh, источник
Я не знаю, почему ваш вопрос был пропущен, но что этот человек сказал вам, не имеет смысла .
добавлено автор Augusto, источник

6 ответы

Ваш компилятор бросается на вас, когда вы пытаетесь? Нет? Тогда это законно в этом отношении.

Предоставляет ли человек, предоставляющий этот «совет» какой-либо канонический документ, разъясняющий стандарт (как в отрасли, так и внутри вашей организации)? Нет? Тогда это мнение.

Проконсультируйтесь со стандартами вашей компании, но в остальном я называю ерундой.

12
добавлено

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

see also Unit testing a method that calls another method

6
добавлено

Когда вы часто вызываете общедоступные методы из других общедоступных методов одного и того же класса, это, вероятно, означает, что у вас ненужные методы утилит. И, может быть, вам стоит попытаться быть немного более СУХОЙ, чтобы облегчить техническое обслуживание и обеспечить удобный доступ к API.

Но это всего лишь предупреждение, совершенно справедливо вызывать общедоступный метод из другого, и вы найдете много примеров стандартного кода java.lang , выполняющего именно это.

Пример из java.lang.String :

1462    public boolean startsWith(String prefix) {
1463        return startsWith(prefix, 0);
1464    }

Не было бы смысла делать некоторые методы приватными только для обеспечения соблюдения правил о публичных методах, не вызывающих другие общедоступные методы.

4
добавлено

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

Почему бы вам не спросить парня, который посоветовал вам объяснить причину? Думаю, ему лучше сказать, чем мы.

2
добавлено

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

0
добавлено

На мой взгляд, вам следует избегать вызова общедоступного метода в рамках другого метода из-за наследования. Рассмотрим классы:

public class Parent {

    //return sum
    public double getSum(double... value){
        //implementation
    }

    //return average
    public double getAverage(int count){
        //call getSum
        double sum = getSum(20, 40, 60);
        return sum/count;

    }
}

public class Child extends Parent {

    @Override
    public int getSum(double... obj){
       //change implementation
       //always return 100;
    }
}

Если вы вызвали метод GetAduc объекта Child, вы получите неожиданное значение, весь интерфейс объекта Child будет нарушен. Вы также должны переопределить метод getAverage ...

Пример с классом String

1462    public boolean startsWith(String prefix) {
1463        return startsWith(prefix, 0);
1464    }

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

0
добавлено
pro.jvm
pro.jvm
3 503 участник(ов)

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш сайт: projvm.com projvm.ru Наш канал: @proJVM Вакансии: @jvmjobs Конфы: @jvmconf

Java & Co
Java & Co
2 370 участник(ов)

Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/75723 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude

learn.java
learn.java
1 888 участник(ов)

Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat

Java Underground
Java Underground
169 участник(ов)

https://vk.com/javatutorial

Javanese Questions
Javanese Questions
109 участник(ов)

Чат предназначен для обмена знаниями строго в формате в вопрос-ответ. Тема — Java, Kotlin и Android. Вопрос должен быть предварительно прогуглен, понятно и грамотно сформулирован, помечен хэштегами. Ответ — тем более. Куски кода размером в несколько строк можно писать прямо здесь, для больших кусков кода стоит использовать http://gist.github.com/, http://pastebin.com/, https://codeshare.io/ или любой аналогичный сервис. В некоторых случаях можно прикреплять скриншоты. Стикеры и гифки запрещены. Дополнять и уточнять вопросы и ответы — редактированием исходного сообщения. Обсуждения должны приводить к редактированию вопроса/ответа и удаляться. По хештегам можно искать существующие вопросы и овтеты: #вопрос #ответ #git #generics #java #server #awt #javafx #swing #kotlin #anko #tornadofx #ktor #android #recyclerView #performance #arch #network #permissions #storage #async