Я не могу прокомментировать верхние ответы, чтобы сказать это: я хотел бы добавить явную точку, которая подразумевается только в верхних ответах:
Нехватывающая группа (?...)
не удаляет символов из исходного полного совпадения, он визуально реорганизует регулярное выражение программисту.
Чтобы получить доступ к определенной части регулярного выражения без определенных посторонних символов, вам всегда нужно будет использовать .group(<index>)
Если вам нужна истинная Singleton
для загрузчиков классов, вам нужен общий родитель для загрузки рассматриваемого класса или вам нужно указать загрузчик классов самостоятельно.
Обновление: из комментария от @ Pshemo ниже справедливой части содержимого в блоге ниже может появиться непосредственно из статьи JavaWorld . Я оставил запись в блоге, так как он все равно может помочь кому-то, но стоит знать, откуда изначально вышло.
Оригинал: есть запись blog , которая дает вам способ сделать это »(хотя я и не пробовал это!), и он выглядит довольно разумно
. В соответствии с нижеприведенным здесь фрагментом кода из моей ссылки выше - я предлагаю вам посетить блог, хотя для полного context:
private static Class getClass(String classname) throws ClassNotFoundException {
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
if(classLoader == null)
classLoader = Singleton.class.getClassLoader();
return (classLoader.loadClass(classname));
}
Это хак, злоупотребляющий тем фактом, что Properties
расширяет Map
, старое неудачное дизайнерское решение.
public final class JvmWideSingleton
{
private static final JvmWideSingleton INSTANCE;
static {
// There should be just one system class loader object in the whole JVM.
synchronized(ClassLoader.getSystemClassLoader()) {
Properties sysProps = System.getProperties();
// The key is a String, because the .class object would be different across classloaders.
JvmWideSingleton singleton = (JvmWideSingleton) sysProps.get(JvmWideSingleton.class.getName());
// Some other class loader loaded JvmWideSingleton earlier.
if (singleton != null) {
INSTANCE = singleton;
}
else {
// Otherwise this classloader is the first one, let's create a singleton.
// Make sure not to do any locking within this.
INSTANCE = new JvmWideSingleton();
System.getProperties().put(JvmWideSingleton.class.getName(), INSTANCE);
}
}
}
public static JvmWideSingleton getSingleton() {
return INSTANCE;
}
}
Это можно сделать параметризованным, но тогда инициализация будет ленивой и пройдет на getSingleton()
.
Properties
на Hashtable
, поэтому он является потокобезопасным (согласно документации). Таким образом, можно использовать props.computeIfAbsent()
. Но мне это нравится больше.
Также читайте здесь: Область свойств Java System
Я только что написал это, и есть шанс, что есть что-то Я забыл, что это помешало бы этому работать.