Интерфейс по сравнению с конкретным классом

Ниже у меня есть интерфейс Person, класс реализации и класс драйвера, который инициализирует Person с именем и просто выводит его снова. В чем преимущество использования

Person person = new PersonImpl();

вместо

PersonImpl person = new PersonImpl();

Предполагается, что интерфейс скрывает реализацию? Это правильный способ использования интерфейсов?

public class Driver {

    public static void main(String [] args)
    {
        Person person = new PersonImpl();
        person.setName("test name");
        System.out.println("Name is "+person.getName());
    }

}


public interface Person {

    public void setName(String name);

    public String getName();

}


public class PersonImpl implements Person{

    private String name;

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

Ответ 1

Это способ использования интерфейсов.

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

Итак, теперь вы можете использовать PersonImpl, но позже вам может понадобиться OtherTypeOfPersonImpl.

Вы можете создать новый класс, реализующий один и тот же интерфейс, и вы можете использовать новый класс с любым другим кодом, который ожидает Person.

Хорошим примером является интерфейс List.

Существует несколько реализаций List, таких как ArrayList, LinkedList и т.д. У каждого из них есть свои преимущества и недостатки. Написав код, который использует List, вы можете позволить каждому разработчику решить, какой тип List работает лучше всего для них, и иметь возможность обрабатывать любые из них без каких-либо изменений.

Ответ 2

что вы сделали правильно. преимущество в использовании Person person = new PersonImpl() заключается в том, что между интерфейсом и конкретной реализацией поддерживается свободное соединение. PersonImpl person = new PersonImpl() плотно соединен. и Person person = new Person() даже не будет компилироваться.

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

Ответ 3

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

Person person = null;
if ...
   person = new PersonImpl();
else 
   person = new PersonImpl2();

Ответ 4

Это зависит от того, как вы хотите использовать Person.

Как бы то ни было, вы не получаете никакой реальной выгоды от наличия интерфейса.

Однако предположим, что есть инопланетяне, которые также могут считаться "Лицом" из-за их поведения (например, "talk(), walks(), thinks(), sens()), которые определены в Person. хотят отделить" Личность "от" Человека "и" Чужой ", чтобы люди из двух разных иерархий -" Люди "в иерархии" млекопитающих "и" Пришельцы "в иерархии" паукообразных" - могли реализовать Интерфейс пользователя.

Ответ 5

Использование интерфейса вместо конкретного класса позволит вам позже изменить реализацию.

Это о JDBC, все это основано на интерфейсах, поэтому драйвер может реализовать его позже.

Например, когда вы используете ResulSet, вам все равно, как или что подразумевается в реализации (с драйвером Oracle будет что-то вроде OracleResultSet, причем драйвер MySQL может быть чем-то вроде MySQLResultSet), но вы знаете, какие методы доступны для вас.

То же самое происходит со списком или картой, вместо ArrayList или HashMap