Возвращаемый тип метода, который реализует интерфейс - PullRequest
3 голосов
/ 07 февраля 2011

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

public interface ITreeNode {
    public ITreeNode getLeftChild();
    public ITreeNode getRightChild();
    public ITreeNode getParent();
}

И у нас есть класс TreeNode, который реализует это:

public class TreeNode implements ITreeNode {
    private TreeNode LeftChild, RightChild, Parent;
    @Override
    public ITreeNode getLeftChild() {
        return this.LeftChild;
    }

    @Override
    public ITreeNode getRightChild() {
        return this.RightChild;
    }

    @Override
    public ITreeNode getParent() {
        return this.Parent;
    }
}

У меня такой вопрос ... должен ли тип возвращаемых данных соответствующих реализованных методов быть ITreeNode или TreeNode и почему.

Eclipse автоматически заполняет методы TreeNode типом возврата ITreeNode. Однако изменение его на TreeNode не вызовет никаких ошибок или предупреждений даже с флагом @Override.

Ответы [ 4 ]

3 голосов
/ 07 февраля 2011

Начиная с Java 5, переопределенные методы могут возвращать любой подкласс интерфейса / класса возвращаемого типа, упомянутого в суперклассе. Я буду придерживаться возврата интерфейса, если это не требуется специально (это происходит главным образом при рефакторинге старого кода, где клиент уже использовал определенный класс реализации, в то время как мы сейчас рефакторинг его для формирования иерархии классов).

2 голосов
/ 07 февраля 2011

Вам нужно решить, что должен делать ваш объект TreeNode.Если его узлы могут содержать другие вещи, кроме TreeNodes, которые реализуют ITreeNode, то не только возвращаемые типы должны быть ITreeNode, но члены экземпляра также должны быть ITreeNode.В противном случае, если это все TreeNode, то мне не понятно, почему вы беспокоитесь об интерфейсе.

2 голосов
/ 07 февраля 2011

Хорошо, то, что вы упомянули, называется ковариантным возвратом, оно не существовало до jdk 1.5.Ковариантные возвращаемые концепции были добавлены в язык Java для поддержки Java Generics.Для получения дополнительной информации, http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf

Я бы предпочел TreeNode в качестве типа возврата в классе TreeNode.

0 голосов
/ 07 февраля 2011

По моему мнению, тип возвращаемого значения должен соответствовать типу интерфейса. Причина, чтобы вы могли изменить базовую реализацию позже

1 Example> ITreeNode node = new Tree1();  // First Underlying Implementation     
2 Example> ITreeNode node1 = new Tree2(); // Second Underlying Implementation    

Я думаю, пожалуйста, поправьте меня, если я ошибаюсь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...