Вот моя проблема. Я хочу документировать часть программы и хочу что-то выразить, я считаю довольно распространенным среди сообщества программистов, но не могу взломать идею в одно слово. Взгляните на этот класс:Невозможно найти идиоматику дизайна/программирования за интуитивно-хорошей практикой: дайте объекту построить детерминированный период
public class RemoteClient {
private InetSocketAddress remoteAddress;
/*+ some other fields not in the scope of this topic*/
public RemoteClient(String hostName, int port
/*+ some other arguments not in the scope of this topic*/){
this.remoteAddress=new InetSocketAddress(hostName, port);
}
public InetSocketAddress getRemoteAddress() {
return this.remoteAddress;
}
}
Очевидной проблемой в многопоточной среде является то, что вызывающий конструктор не имеет никаких гарантий, что hostName
будет решена, и, следовательно, время сборки не является детерминированным. Было бы, как мне кажется, гораздо лучше, если строительство InetSocketAddress
поленился, такие как следующие:
public class RemoteClient {
private volatile InetSocketAddress remoteAddress;
private final String hostName;
private final int port;
/*+ some other fields not in the scope of this topic*/
public RemoteClient(String hostName, int port
/*+ some other arguments not in the scope of this topic*/){
this.hostName=hostName;
this.port=port;
}
/** lazy instanciation **/
public InetSocketAddress getRemoteAddress() {
if(remoteAddress==null){
synchronized(hostName){
if(remoteAddress==null){
this.remoteAddress=new InetSocketAddress(hostName, port);
}
}
}
return this.remoteAddress;
}
}
Таким образом, в этом случае Thread
вызова оператора конструктора, который мог бы на какое-то время строить из списка имена хостов, больше не связано с сетью. Теперь он делегирован Thread
, который отвечает за связь с удаленным клиентом.
-
Мои вопросы:
- вы можете указать причины, почему второе утверждение/не лучше разработаны?
- не могли бы вы сказать слово на идиоме за этой практикой?
Я считаю, что это не мнение на основе темы, как я прошу дизайн.
'двойная проверка блокировки'? – EpicPandaForce
Ленивая инициализация кажется более подходящей. Двойная проверка блокировки - это то, что вам нужно сделать для ее достижения. – pimaster
Помимо того факта, что вы на самом деле используете двойной шаблон блокировки, я бы сказал, что шаблон, который вы ищете, уже находится в вашем комментарии: ** ленивый instanciation **. Термин * блаженный * ** Lazy Loading **. – Oncaphillis