Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / интересно разобраться / 17 сообщений из 17, страница 1 из 1
14.09.2013, 19:30:40
    #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
14.09.2013, 20:23:12
    #38396815
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
интересно разобраться
rema174И какие преимущества использование *.class (не конкретного экземпляра, а расширения class в программе) ? http://ru.wikipedia.org/wiki/Отложенная_инициализация
...
Рейтинг: 0 / 0
14.09.2013, 21:10:14
    #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
14.09.2013, 21:17:22
    #38396829
rema174
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
интересно разобраться
если оставить только внутренний if, результат будет такой же
...
Рейтинг: 0 / 0
14.09.2013, 21:28:32
    #38396834
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
интересно разобраться
rema174если оставить только внутренний if, результат будет такой же http://ru.wikipedia.org/wiki/Double_checked_locking
...
Рейтинг: 0 / 0
14.09.2013, 22:14:54
    #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
14.09.2013, 22:23:50
    #38396867
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
интересно разобраться
А при чем тут отложенная инициализация?
Это ж абстрактная фабрика.
Только странноватая...
...
Рейтинг: 0 / 0
14.09.2013, 23:14:40
    #38396877
rema174
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
интересно разобраться
MasterZiv,
там возбуждается рантайм исключение вероятно только по причине, чтобы дальше не усложнять выяснение причин проблем, т.е. для отладки...

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

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

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



Всё не так.

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

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

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

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

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

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


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

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


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

Возбуждается-то оно возбуждается, только почему именно такое, почему абстрактное базовое исключение кидается ?
Тежеловато отлаживаться будет...
...
Рейтинг: 0 / 0
15.09.2013, 10:04:15
    #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
15.09.2013, 15:51:47
    #38397042
rfq
rfq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
интересно разобраться
rema174но все-равно сделал по-своему, и, странное дело, работает
Работает, но по другому. Исходный вариант выдавал разнве экземпляры при последовательных вызовах create(actionName) с одним и тем же параметром, а ваш вариант выдает один и тот же экземпляр.
...
Рейтинг: 0 / 0
15.09.2013, 16:12:54
    #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
15.09.2013, 16:33:09
    #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
15.09.2013, 23:18:33
    #38397175
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
интересно разобраться
rema174,

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


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