Как стать автором
Обновить
3
0
Дмитрий Овчинников @dcordero

Пользователь

Отправить сообщение

Настраиваем редактор исходных текстов SWI-Prolog (XPCE Emacs) для пользователя, не знакомого с клавиатурными комбинациями Emacs

Время на прочтение2 мин
Количество просмотров7.5K
Приступающие к изучению и/или работе с SWI-Prolog (http://www.swi-prolog.org/) часто сталкивается зачастую с не очень «дружелюбным интерфейсом командной строки вот в таком стиле:

dm@dms:~> swipl
% library(swi_hooks) compiled into pce_swi_hooks 0.00 sec, 3,856 bytes
% /home/dm/.plrc compiled 0.00 sec, 656 bytes
Welcome to SWI-Prolog (Multi-threaded, 64 bits, Version 5.10.2)
Copyright (c) 1990-2010 University of Amsterdam, VU Amsterdam
SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to redistribute it under certain conditions.
Please visit http://www.swi-prolog.org for details.

For help, use ?- help(Topic). or ?- apropos(Word).

?- 


Даже сумев вызвать-таки редактор исходного кода, многие затрудняются с ним работать по причине того, что клавиатурные комбинации соответствуют достаточно харизматичному и отличающемуся от других редактору Emacs.

Как это исправить?

Наберите в командной строке „help.“
?- help.

Читать дальше →
Всего голосов 2: ↑2 и ↓0+2
Комментарии0

Конфигурирование бинов с помощью аннотаций: решение проблемы с отсутствием наследования для интерфейсов аннотаций

Время на прочтение15 мин
Количество просмотров8.3K

Описание проблемы


Пусть у нас есть некоторый класс X, параметризующийся из контейнера свойств PX и есть класс Y, расширяющий X, параметризующийся контейнером PY, расширяющим PX.

Если контейнерами свойств выступают аннотации, то мы имеем два класса:

@PX(propertyX1 = <valueX1>, ..., propertyXN = <valueXN>)
class X {
...
}

И есть класс:
@PY(propertyY1 = <valueY1>, ..., propertyYN = <valueYN>)
class Y extends X {
...
}

Java (в том числе и Java 8) не предоставляют возможность наследования аннотаций, поэтому написать что-то вроде примера ниже нельзя:

public @interface PX extends PY {
}

Разумеется, это не проблема, вот решение:

@PX
class X {

  protected final ... propertyX1;
  ...
  protected final ... propertyY1;

  X() {
    final PX px = getClass().getAnnotation(PX.class);
    propertyX1 = px.propertyX1();
    ...
    propertyXN = px.propertyXN();
  }
}

@PY
class Y extends X {

   Y() {
      final PY py = getClass().getAnnotation(PY.class);
      propertyY1 = py.propertyY1();
      ...
      propertyYN = py.propertyYN();
   }
}


В чем здесь недостаток? Недостаток в том, что мы обрекаем себя на то, что если у класса не будет аннотаций, то он будет сконфигурирован дефолтными значениями (аннотации PX и PY должны быть @Inherited для этого).

Как быть, если нам, к примеру, надо инжектировать проперти из файла .properties или взять их из какого-либо другого источника, например из спрингового Environment?

Если не прибегать к изощренным трюкам типа создания аннотированных классов «на лету» с подстановкой параметров аннотаций, то ничего.
Читать дальше →
Всего голосов 8: ↑5 и ↓3+2
Комментарии23

Информация

В рейтинге
Не участвует
Откуда
Минск, Минская обл., Беларусь
Дата рождения
Зарегистрирован
Активность