2015-05-05 3 views
6

У меня есть интерфейс, который определяет setter/getter, используя методы по умолчанию java 8, но я получаю сообщение об ошибке при попытке подключить его весной. Я действительно хочу избежать использования абстрактного класса, и я не хочу дублировать код. Вот что я делаю:Инъекция зависимостей для java 8 методов интерфейса по умолчанию

public interface MyProcessor 
{ 
    public static final WeakHashMap<Function1D, Integer> paramMap = new WeakHashMap<>(); 

    default void setParam(int param) 
    { 
     paramMap.put(this, param); 
    } 

    default int getParam() 
    { 
     return paramMap.get(this); 
    } 

    default double doSomthingWithParam(double x) 
    { 
      return doSomething() * getParam(); 
    } 

    double doSomething(); 
} 


public class MyProcessorImp extends SomeClass implements MyProcessor 
{ 
    double doSomething() {....} 
} 

    <bean class="....MyProcessorImp"> <property name="param" value="3"/></bean> 

Bean свойство «пары» не доступны для записи или имеют недопустимый метод установки.

+3

Почему вы хотите, чтобы избежать использования абстрактного класса? Наследование реализации - именно то, для чего предназначены абстрактные классы. Кроме того, вы действительно имели в виду, что 'paramMap' является' static'? Обратите внимание, что это означает, что существует только один параметр paramMap, который разделяется между всеми экземплярами всех классов, реализующих интерфейс. – Jesper

+0

Да, я действительно хотел, чтобы он был статичным, это единственный способ, которым он может работать. у меня возникло чувство, что ответ на мой вопрос будет вопросом, таким как, я не хочу сейчас входить в модель программирования, но просто возьмите его как действительную причину и прочитайте методы java 8 по умолчанию, спросите себя почему он был добавлен как новая архитектурная особенность, и тогда вы можете понять мою причину этого. – Saul

+0

Основная причина, по которой методы по умолчанию были добавлены в Java 8, - это возможность добавлять методы к интерфейсам без нарушения обратной совместимости - не как замена абстрактных классов. – Jesper

ответ

0

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

Переделка код выше, это будет выглядеть так:

public interface MyProcessor { 

    // get the implementor to get the hash map 
    WeakHashMap<Function1D, Integer> getParamMap(); 

    default double doSomthingWithParam(double x) { 
    return doSomething() * getParam(); 
    } 

    // uses the implementor's getParamMap() to get params 
    default int getParam() { 
    return getParamMap().get(this); 
    } 

    double doSomething(); 
} 

public class MyProcessorImp extends SomeClass implements MyProcessor { 

    final WeakHashMap<Function1D, Integer> paramMap = new WeakHashMap<>(); 

    void setParam(int param) { 
    paramMap.put(this, param); 
    } 

    @Override WeakHashMap<Function1D, Integer> getParamMap() { 
    return paramMap; 
    } 

    @Override double doSomething() { 
    // elided 
    } 
} 
Смежные вопросы