Привет. Есть у меня самописный набор классов а-ля Java Beans, т.е.:
class DummyBean
{
private String m_str_prop;
private List<PropertyListener> m_listeners;
@PropertyAccessor
public String getStringProp()
{
return m_str_prop;
}
@PropertyAccessor
public void setStringProp(String a_str)
{
if(!m_str_prop.equals(m_str_prop = a_str))
{
// дергаем слушателей
firePropertyChangeEvent();
}
}
// ...
public void addPropertyListener(PropertyListener l)
{
// ...
}
public void firePropertyChangeEvent()
{
// ...
}
// далее код анализа свойств бина и доступа к ним по строковому ИД (см. пояснение)
}
Задача сделать так, чтобы вышеупомянутый метод каким-то образом сообщал слушателям идентификатор события.
Внимательный ЛОРовец наверняка заметил аннотацию PropertyAccessor. Это велосипед, который позволяет занести свойства бина в мап, чтобы пользователь мог применить оба способа изменения свойства:
DummyBean db = new DummyBean();
db.setProperty("StringProp","new value"); // первый способ
db.setStringProp("new value"); // второй способ
Напомню задачу, нужно чтоб слушатели события изменения свойства получали его идентификатор. Решение проблемы очевидно (с самого начала :) ):
...
@PropertyAccessor
public void setStringProp(String a_str)
{
if(!m_str_prop.equals(m_str_prop = a_str))
{
// дергаем слушателей
firePropertyChangeEvent("StringProp");
}
}
public void firePropertyChangeEvent(String a_prop_id)
{
// ...
}
...
Извиняюсь за простыню, надеюсь доступно объяснил проблему, жду ваших вопросов/предложений по решению)
PS. Вот, например, есть вариант в методе firePropertyChangeEvent() определять имя вызывающего метода путем анализа стека. Но это совсем не красиво, кмк.
Еще можно использовать compile-time аннотации, чтобы компилятор дописывал ид события сам. Это труъ?