Обновить
54
0
Иван Холопик@sody

Говнокодер

Отправить сообщение
Все очень просто — если надо во время тестов подменить провайдер, нужно просто подложить в тест класпас нужный файлик, ну или как вариант подложить свой фэйковый класлоадер.
Еще похожий пример — slf4j, используется свой костыль.

Еще может быть полезно, как я уже в статье говорил, если приложение достаточно старое и громоздкое и очень сложно перейти на использование IoC-контейнера, например если построено на синглтонах и фабриках. Вот здесь этот механизм как раз кстати, и волки целы, и овцы сыты и код практически не надо переделывать, и расширения писать удобно.
Перевел статью, так как очень мне понравилась. Многие (я тоже до некоторого времени) путают такие принципы как dependency injection и inversion of control. Фаулер в этой статье четко определяет последнее, показавая что dependency injection это всего лишь частный случай реализации inversion of control. Также начал было уже переводить его статью Inversion of Control Containers and the Dependency Injection pattern, но нашел уже готовый перевод в сети
Добавил примеры. В случае шаблонного метода Фаулер рассматривает JUnit. Мы реализуем методы setUp, tearDown, добавляем тесты (методы testBlaBlaBla), затем для запуска тестов выполняем:
TestRunner.run(SomeTest.class);

В итоге мы вызываем JUnit, но не вызываем наши методы, JUnit вызывает их, следовательно происходит явление инверсии управления.
Еще обещают приложения под андроид и айфон, на телефоне такая штука может оказаться весьма полезной.
Я предложил решение проблеммы методом велосипеда, любишь читать джавадоки — предложи свой рабочий вариант используя стандартные средства
Cмотрел и знаю, поэтому и говорю, что он используется для синхронизации потоков, у меня другая ситуация, нужно использовать не только в условиях нескольких потоков, но и в условиях когда вызывается из одного.
что будет если вызвать дважды из одного потока?

P.S. хотел было топик опубликовать, но оказалось кармы недостаточно, уйду домой злой :E
Нет, он используется во многопоточном окружении для паттерна строитель при создании прокси объектов.
Не путать java5 Lock с этим, тот, про который вы спрашиваете, будет сидеть и ждать до потери пулься или пока таймаут не произойдет. Тот, что я представил, если залочен, сразу выбросит исключение.
забыл уточнить, unlock метода на самом деле нет, это только для этого примера вставил, т.е. если lock.get() == true, то оно уже не станет false.
ясно, узнал много нового, раньше никогда не работал с AtomicBlablabla классами.
Cпасибо за совет, буду иметь ввиду, только synchronized секция вроде как тоже не нужна, просто:
public void check() {
   if (lock.get()) {
      /* Some code here */
   }
}
ну check метод вобщем-то можно и не делать synchronized, в нем переменная не модифицируется
Я использую этот класс для своих нужд, во многопоточном окружении, где без synchronized не обойтись.
Они используются для немного другой логики — синхронизации потоков. Когда один поток вызывает lock(), другой будет просто ждать освобождения ресурса. Можно конечно воспользоваться tryLock() с указанием таймаута, но это приведет к потере времени, а следовательно к понижению производительности всего приложения.
Ну тогда:
} catch (IllegalStateException e) {
   return getDefault();
}

Но я бы в таком случае воспользовался invalidated значением. Или если оно еще не установлено, то дефолтным:
} catch (IllegalStateException e) {
   return value != null ? value : getDefault();
}

Поправка к методу get:
public ValueType get() {
   // выполняем update() только если значение устарело
   if (isInvalid) {
      // этот флаг обязательно нужно снять по выходу из update()
      try {
         locker.lock();
         // выполняем обновление
         value = update();

         // isInvalid станет false только если update()
         // выполнился штатно без эксепшенов
         isInvalid = false;
      } catch (IllegalStateException e) {
        throw new RecursionDetectedException(this, e);
      } finally {
        // снимаем флаг в любом случае, как бы не завершилась get()
        locker.unlock();
      }
   }

   return value;
}
Еще можно использовать нечто вроде такой утилитки:

public class Locker {
	private boolean lock;

	/**
	 * Checks if instance is locked.
	 *
	 * @throws IllegalStateException if instance is locked
	 */
	public synchronized void check() {
		if (lock) {
			throw new IllegalStateException("Locked");
		}
	}

	/**
	 * Locks instance to prevent use it again.
	 *
	 * @throws IllegalStateException if instance is locked
	 */
	public synchronized void lock() {
		check();
		lock = true;
	}

	/**
	 * Unlocks instance.
	 */
	public synchronized void unlock() {
		lock = false;
	}
}


тогда метод get будет выглядеть так:

...
try {
  // выполняем обновление
  locker.lock()
  value = update();
  locker.unlock()
}
...
Также хочу добавить, что reporting секция POM'a претерпела ряд изменений в 3.x ветке мавена, ее перенесли в настройки site плагина. Подробнее здесь.
2

Информация

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