powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / интересно разобраться
17 сообщений из 17, страница 1 из 1
интересно разобраться
    #38396803
rema174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
public class Factory {
	
	protected Map<String, Class<?>> map = defaultMap();
	
	public Action create(String actionName) {
		Class<?> klass = (Class<?>) map.get(actionName);
		
                if (klass == null)
			throw new RuntimeException();
		
		Action actionInstance = null;
		try {
			actionInstance = (Action) klass.newInstance();
		} catch (Exception e) {
			e.printStackTrace();
		}

		return actionInstance;
	}
	protected Map<String, Class<?>> defaultMap() {
		Map<String, Class<?>> map = new HashMap<String, Class<?>>();
		map.put("index", Bootstrap.class);
                ...
		return map;
	}
}


попался код, интересно разобраться что и куда,
вот например, зачем в map помещают Bootstrap.class ( Bootstrap имплементит интерфейс Action ), чтобы потом сделать (Action) klass.newInstance(); т.е. почему сразу не создают Map<String, Action> map
И какие преимущества использование *.class (не конкретного экземпляра, а расширения class в программе) ?
...
Рейтинг: 0 / 0
интересно разобраться
    #38396815
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rema174И какие преимущества использование *.class (не конкретного экземпляра, а расширения class в программе) ? http://ru.wikipedia.org/wiki/Отложенная_инициализация
...
Рейтинг: 0 / 0
интересно разобраться
    #38396824
rema174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Usmanrema174И какие преимущества использование *.class (не конкретного экземпляра, а расширения class в программе) ? http://ru.wikipedia.org/wiki/Отложенная_инициализация
тут, не совсем понятно
Код: java
1.
2.
3.
4.
5.
6.
7.
if (singleInstance == null) {
            synchronized (SomeObject.class) {
                if (singleInstance == null) {
                    singleInstance = new SomeObject();
                }
            }
        }


средний if создаст singleInstance, если тот не существует,
а как понимать внешний if - упреждает другие потоки чтоли?
Код: java
1.
2.
3.
4.
if (singleInstance == null) {
            synchronized (SomeObject.class) {
                ...
            }
...
Рейтинг: 0 / 0
интересно разобраться
    #38396829
rema174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
если оставить только внутренний if, результат будет такой же
...
Рейтинг: 0 / 0
интересно разобраться
    #38396834
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rema174если оставить только внутренний if, результат будет такой же http://ru.wikipedia.org/wiki/Double_checked_locking
...
Рейтинг: 0 / 0
интересно разобраться
    #38396862
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rema174
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
public class Factory {
	
	protected Map<String, Class<?>> map = defaultMap();
	
	public Action create(String actionName) {
		Class<?> klass = (Class<?>) map.get(actionName);
		
                if (klass == null)
			throw new RuntimeException();
		
		Action actionInstance = null;
		try {
			actionInstance = (Action) klass.newInstance();
		} catch (Exception e) {
			e.printStackTrace();
		}

		return actionInstance;
	}
	protected Map<String, Class<?>> defaultMap() {
		Map<String, Class<?>> map = new HashMap<String, Class<?>>();
		map.put("index", Bootstrap.class);
                ...
		return map;
	}
}


попался код, интересно разобраться что и куда,
вот например, зачем в map помещают Bootstrap.class ( Bootstrap имплементит интерфейс Action ), чтобы потом сделать (Action) klass.newInstance(); т.е. почему сразу не создают Map<String, Action> map
И какие преимущества использование *.class (не конкретного экземпляра, а расширения class в программе) ?


Странный вопрос.... Ты вообще класс от объекта отличаешь? Разные вещи немного...


Впрочем, код тоже весьма странный...

Одно выкидывание RuntimeException чего стоит, затем ловля и поедание исключения при преобразовании, и почему вдруг Action...
В общем, много загадок...
...
Рейтинг: 0 / 0
интересно разобраться
    #38396867
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А при чем тут отложенная инициализация?
Это ж абстрактная фабрика.
Только странноватая...
...
Рейтинг: 0 / 0
интересно разобраться
    #38396877
rema174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv,
там возбуждается рантайм исключение вероятно только по причине, чтобы дальше не усложнять выяснение причин проблем, т.е. для отладки...

хм, ну если вопрос странный, то можно растолковать... раньше не сталкивался с примерами где бы использовались *.class

сейчас в map хранятся классы, а экземпляры экшинов создаюся c помощью записей из map,
так почему сразу нельзя в mар записать экземпляры экшинов, и брать их оттуда при надобности?
ведь все сводится, чтобы получить (Action) klass.newInstance();

или все не так?
...
Рейтинг: 0 / 0
интересно разобраться
    #38396882
rema174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
получатся, это и есть т.н. «ленивая инициализация», чтобы создавать экшины по мере надобности...
...
Рейтинг: 0 / 0
интересно разобраться
    #38396932
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rema174или все не так?



Всё не так.

Это не отложенная инициализация, это -- абстрактная фабрика.

http://ru.wikipedia.org/wiki/Абстрактная_фабрика

Отложенная инициализация -- это когда тебе нужно создать от нуля до одного экземпляра класса, т.е. фактически опционально создать один, объект, глобальный для приложения. Поскольку его создание дорого по каким-то его внутренним причинам, то тебе не хочется создавать его при инициализации приложения, а только в момент первого требования использования этого объекта,
который (момент) может вообще не наступить.

Это же -- средство создания комплекса объектов по их функциональному назначению с возможностью вместо базовых объетов создавать для каждого элемента комплекса наследников (т.е. любые реализации) вместо определённых классов.
Тут безусловно тоже есть эффект отложенной инициализации, но цель всего кода совсем другая.

rema174хм, ну если вопрос странный, то можно растолковать... раньше не сталкивался с примерами где бы использовались *.class

сейчас в map хранятся классы, а экземпляры экшинов создаюся c помощью записей из map,
так почему сразу нельзя в mар записать экземпляры экшинов, и брать их оттуда при надобности?
ведь все сводится, чтобы получить (Action) klass.newInstance();


Если бы ты запихивал в map экземпляры Action, то это было бы средство хранения именованых ссылок на экземпляры,
а тут нужно средство именно создания новых экземпляров классов.
Класс тут используется как ссылка на метод (функцию) создания экземпляра данного класса.

rema174MasterZiv,
там возбуждается рантайм исключение вероятно только по причине, чтобы дальше не усложнять выяснение причин проблем, т.е. для отладки...
...
Рейтинг: 0 / 0
интересно разобраться
    #38396934
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
rema174MasterZiv,
там возбуждается рантайм исключение вероятно только по причине, чтобы дальше не усложнять выяснение причин проблем, т.е. для отладки...


Блин, не дописал.

Возбуждается-то оно возбуждается, только почему именно такое, почему абстрактное базовое исключение кидается ?
Тежеловато отлаживаться будет...
...
Рейтинг: 0 / 0
интересно разобраться
    #38396938
rema174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в эксепшине это я хотел упростить, просто убрал расшифровку, а получилось непонятно...

MasterZivЕсли бы ты запихивал в map экземпляры Action, то это было бы средство хранения именованых ссылок на экземпляры, а тут нужно средство именно создания новых экземпляров классов. Класс тут используется как ссылка на метод (функцию) создания экземпляра данного класса. идея понятна


но все-равно сделал по-своему, и, странное дело, работает


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
public class Factory {
	
	protected Map<String, Action> map = defaultMap();
	
	public Factory() {
		super();
	}
	
	public Action create(String actionName) {
		return map.get(actionName);
	}
	
	protected Map<String, Action> defaultMap() {
		
		Map<String, Action> map = new HashMap<String, Action>();

		try {
			map.put("index", (Action) (Bootstrap.class).newInstance());
		} catch (InstantiationException | IllegalAccessException e) {}
		...
		return map;
	}
}
...
Рейтинг: 0 / 0
интересно разобраться
    #38397042
rfq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rema174но все-равно сделал по-своему, и, странное дело, работает
Работает, но по другому. Исходный вариант выдавал разнве экземпляры при последовательных вызовах create(actionName) с одним и тем же параметром, а ваш вариант выдает один и тот же экземпляр.
...
Рейтинг: 0 / 0
интересно разобраться
    #38397050
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rema174в эксепшине это я хотел упростить, просто убрал расшифровку, а получилось непонятно...

MasterZivЕсли бы ты запихивал в map экземпляры Action, то это было бы средство хранения именованых ссылок на экземпляры, а тут нужно средство именно создания новых экземпляров классов. Класс тут используется как ссылка на метод (функцию) создания экземпляра данного класса. идея понятна


но все-равно сделал по-своему, и, странное дело, работает


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
public class Factory {
	
	protected Map<String, Action> map = defaultMap();
	
	public Factory() {
		super();
	}
	
	public Action create(String actionName) {
		return map.get(actionName);
	}
	
	protected Map<String, Action> defaultMap() {
		
		Map<String, Action> map = new HashMap<String, Action>();

		try {
			map.put("index", (Action) (Bootstrap.class).newInstance());
		} catch (InstantiationException | IllegalAccessException e) {}
		...
		return map;
	}
}



Ты не замечаешь, что метод CREATE у тебя не создает объект?
А фабрика нужна для создания объектов.
...
Рейтинг: 0 / 0
интересно разобраться
    #38397054
rema174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rfq Работает, но по другому. Исходный вариант выдавал разные экземпляры при последовательных вызовах create(actionName) с одним и тем же параметром, а ваш вариант выдает один и тот же экземпляр.
это даже лучше, там реально достаточно одного экземпляра для конкретного параметра

MasterZivТы не замечаешь, что метод CREATE у тебя не создает объект?
А фабрика нужна для создания объектов.
главное, что на выходе выдает нужный экшин. можно даже еще проще
Код: java
1.
2.
3.
try {
			map.put("index", (Action) (Bootstrap.class).newInstance());
		} catch (InstantiationException | IllegalAccessException e) {}


Код: java
1.
map.put("index", new Bootstrap());
...
Рейтинг: 0 / 0
интересно разобраться
    #38397175
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rema174,

Ну, с такой логикой можно вообще весь код удалить, и клиенту словами сказать, чтобы он когда ему будет нужно новый Action, чтобы он его сам брал где- нибудь
...
Рейтинг: 0 / 0
интересно разобраться
    #38397363
rema174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv,
конечно, это уже не фабрика, но в данном случае, другого там не нужно, да и клиент я сам)
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / интересно разобраться
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]