Так, чисто щоб самому не забути, і було де подивитися, раптом оригінал закосячить
Отже, мало хто зна (хоч напевно багато хто підозрює), що те що ми зазвичай пишемо і називаємо сінглетоном насправді ніякий не одинак і маю купу чудових сюрпрайзів на випадок ситуації з кількома класлоадерами. Отже, правильний сінглетон (для сановскої ЖВМ) виглядає ось так:
import java.lang.reflect.*;
/**
* There can be only one - ie. even if the class is loaded in several different classloaders,
* there will be only one instance of the object.
*/
public class AbsoluteSingleton implements SingletonInterface {
/**
* This is effectively an instance of this class (although actually it may be instead a
* java.lang.reflect.Proxy wrapping an instance from the original classloader).
*/
public static SingletonInterface instance = null;
/**
* Retrieve an instance of AbsoluteSingleton from the original classloader. This is a true
* Singleton, in that there will only be one instance of this object in the virtual machine,
* even though there may be several copies of its class file loaded in different classloaders.
*/
public synchronized static SingletonInterface getInstance() {
ClassLoader myClassLoader = AbsoluteSingleton.class.getClassLoader();
if (instance==null) {
// The root classloader is sun.misc.Launcher package. If we are not in a sun package,// we need to get hold of the instance of ourself from the class in the root classloader.
if (! myClassLoader.toString().startsWith("sun.")) {
try {
// So we find our parent classloader
ClassLoader parentClassLoader = AbsoluteSingleton.class.getClassLoader().getParent();
// And get the other version of our current class
Class otherClassInstance = parentClassLoader.loadClass(AbsoluteSingleton.class.getName());
// And call its getInstance method - this gives the correct instance of ourself
Method getInstanceMethod = otherClassInstance.getDeclaredMethod("getInstance", new Class[] { });
Object otherAbsoluteSingleton = getInstanceMethod.invoke(null, new Object[] { } );
// But, we can't cast it to our own interface directly because classes loaded from// different classloaders implement different versions of an interface.// So instead, we use java.lang.reflect.Proxy to wrap it in an object that *does*// support our interface, and the proxy will use reflection to pass through all calls// to the object.
instance = (SingletonInterface) Proxy.newProxyInstance(myClassLoader,
new Class[] { SingletonInterface.class },
new PassThroughProxyHandler(otherAbsoluteSingleton));
// And catch the usual tedious set of reflection exceptions// We're cheating here and just catching everything - don't do this in real code
} catch (Exception e) {
e.printStackTrace();
}
// We're in the root classloader, so the instance we have here is the correct one
} else {
instance = new AbsoluteSingleton();
}
}
return instance;
}
private AbsoluteSingleton() {
}
private String value = "";
public String getValue() { return value; }
public void setValue(String value) {
this.value = value;
}
}
Доречі, думається мені, що ситуацію з синхронізацією можна покращити (!) якщо заюзати AtomicReference
Дуже корисна книга, присвячена Apache Commons і ще цілому ряду популярних бібліотек/фреймворків. Хоч у моїй практиці ця бібліотека і мала місце, але, як я зараз бачу, у далеко недостатньому обсязі. Читати потрібно обов"язково. щоб уникнути сотень велосипедів і дізнатися про нові рішення й шляхи їх пошуку. Інформація подається дуже чітко та якісно. Ставить проблема ("велосипед") і зазвичай на цій же сторінці дається її елегантне рішення. Більш того, в окремій главі описується Google Buffer Protocol - доволі маловідома, але дуже корисна штука, про яку розповідали на одній з перших зустрічей Lviv Java User Group І головне, книга ще не дописана, форматування кривеньке, але головне - її можна офіційно бузкоштовно скачати тут Viva communism!:))
аплодую стоячи феноменальний ролік передивився кілька разів - геніально)
One of the most compelling dramas of our time...
яка проробка деталей, ну це просто супер, тішуся! ps не ради флейму, зроблено ж супер pps зверніть увагу, "красную кашпочку" завти Scala. скала прикольно, бу вичти і юзати скалу))
приходжу я додому, а тут такий файний сюрпрайз в інеті: вийша Google Collections Library 1.0 здається, тепер в складі Gogle Guava Beautiful code with Google Collections & Guava уря, мені так не вистачало Multimap guidelines на хабрі
дійшов висновку, що англійська таки не найжахливіша з цивілізованих європейських мов. Адже є німецька! у них є чудова літера ß, яка у верхньому реєстрі виглядає як SS !!! ну і на фінал:
Последнии дни в rss неоднократно мелкал заголовок "Noop - новый язык программирования от Google". Мимо я проти ну никак немог:) А действительность оказалась жесткой:( Во-первых, гугл покуда отношения к нему не имеет, разве что несколько сотрудников работают в гугле. Во-вторых, сказать что язык сырой - это еще мягко. Еще не все фичи утверждены. Положительный строны, имхо, являются следующие: 1) предназначен для JVM 2) имеет поддержку на уровне языка DI (IoC) 3) имеет поддержку модульного тестирования на уровне языка Из минусов (перечеркивающий все плюсы): !) отстствие наследования (как я понял) На текущий момент язык крайне сырой, если я захочу его поробывать то мне нужно скачать до 4ех прог и искодники, собрать среду и только тогда запускать. а примеры крайне беды, из них ничего сказать нельзя:( Да о чем мы говорим:) они даже за название спорятся: есть варианты Noop, Nøøp, NooP. Идея с DI and in-built modul tests мне нравится, хотя нада глянуть не спаскудят ли они ее. как-то так, через год посмотрим
практически биография тут . Кстати, один из основателей САН = Энди Бехтольшейм (Andy Bechtolsheim), очень примечательная личность:) Потому что благодаря ему Google называется именно так! Это он стал первым инвестором гугла, подарив (!) молодой компании 100 тыс "убитых енотов", но... сделав описку в чеке: написал название компании Google. Поэтому, что бы получить деньги в банке, Брину и Пейджу пришлось переименовывать свое детище в Google. Так что Sun мы обязаны не только за Java но и за Google:)
Comments
але для американця, який має 20ть кредитів важлива лише абсолютна сума заробітку - а в ІТ вона далеко не найвища