Объясните принцип работы Interface в java

290
16 июля 2017, 10:49

Добрый день. Есть интерфейс, например

public interface MyInterface {
    MyClassTestInt update (Long id, String user, Long groupId);
}

Есть некий класс

public class MyClassTestInt implements Serializable {
    private Long id = 3L;
    private String name;
    public MyClassTestInt(MyClassTestInt buf) {
        if (buf != null) {
            this.id = buf.getId();
            this.name = buf.name;
        }
    }
    public MyClassTestInt() {
    }
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

И есть вот такой класс

public class NyRelClass {
    MyInterface myInterface;
    public void up(Long id, String name, Long groupId) {
       MyClassTestInt myClassTestInt = myInterface.update(id, name, groupId);
    }
}

Я вот никак не пойму, вот эту строку

MyClassTestInt myClassTestInt = myInterface.update(id, name, groupId);

Каким образом мы получим объект myClassTestInt, вызвав метод у интерфейса? Я так понимаю его же где-то реализовать надо, и переопределить методы его, но тут, как он создает объект?

Answer 1

Автор упустил в вопросе самое главное: что это Spring и что поле класса аннотировано как @Autowired.

Что собственно говорит Spring-у: вставь сюда подходящую имплементацию интерфейса.

Это называется Dependency Injection (DI), когда зависимые объекты подставляются в другой объект без явной их инициализации в коде.

Answer 2

Допустим у нас есть интерфейс:

interface MyInterface {
    void method();
}

Чтобы начать им пользоваться нам потребуется его реализация. Есть несколько способов это сделать:

Обычный класс:

class MyClass implements MyInterface {
    public void method(){
        System.out.println("Hello world");
    }
}

Анонимный класс:

MyInterface instance = new MyInterface(){
    public void method(){
        System.out.println("Hello world");
    }
}

В виде лямбды функции. Для этого нужно чтобы интерфейс был функциональным, т.е содержал бы один метод. В данном примере, он таковым и является.

MyInterface instance = ()-> System.out.println("Hello world");

Есть еще вариант, без явного создания экземпляра данного класса, с использованием прокси:

MyInterface instance = (MyInterface) Proxy.newProxyInstance(
            ClassLoader.getSystemClassLoader(), new Class<?>[]{MyInterface.class},
            new InvocationHandler() {
                @Override
                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                    System.out.println("hello world");
                    return null;
                }
            });
READ ALSO
Долгий процесс Java EE

Долгий процесс Java EE

Есть сайтЕсть процесс который может занять долгое время

234
Проблемный многопоточный код

Проблемный многопоточный код

У меня есть такой участок кода:

201
Маcштабирование текстуры в PolygonRegion

Маcштабирование текстуры в PolygonRegion

Суть проблемы такова: имеется polygonRegion в котором содержится данная текстура (рис1)

205