Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Static abstract method / 9 сообщений из 9, страница 1 из 1
07.02.2013, 15:02:42
    #38141867
Lisichkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Static abstract method
Добрый день!
Помогите реализовать алгоритм.

Имеется абстрактный класс "Телефон" и куча наследников от данного класса -
"ТелефонSamsumg", "ТелефонHTC" и т.д.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
public abstract class phoneBase {
	protected Context context;
	protected String cpuInfo;

	phoneBase(Context context, String cpuInfo) {
		this.context = context;
		this.cpuInfo = cpuInfo;
	}

	//public abstract static boolean isMe(String cpuInfo)
	public abstract String getICC(int sim);
	public abstract String getSimOperatorName(int sim);
}



У базового класса "Телефон" должен быть абстрактный статический метод isMe – который определяет запущен ли объект на конкретном телефоне или нет.
Но в Java запрещено иметь абстрактные статические методы – поэтому данный метод исключен из базового класса и добавлен в каждый потомок в качестве статического.

Имеется Фабрика "phoneFactory" которая должна возвращать объект наследник класса "Телефон", в зависимости от телефона, на котором запущена программа.

Код: 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 phoneFactory {
	private static Class<?>[] phones = {phoneSamsung.class, phoneHTC.class,........};
	
	@SuppressWarnings("unchecked")
	private static Class<? extends phoneBase> getPhoneClass(String cpuInfo) throws Exception {
		for(Class<?> c : phones) {
			Method isMe = c.getMethod("isMe", new Class[] { String.class });
			Object flag = isMe.invoke(null, new Object[] { cpuInfo });
			if (flag!=null && 
					(flag instanceof Boolean) &&
					(Boolean)flag)
				return	(Class<? extends phoneBase>)c;
		}
		return	phoneDefault.class;
	}
	
	public static phoneBase getPhone(Context context, String cpuInfo) throws Exception {
		Class<? extends phoneBase> c = getPhoneClass(cpuInfo);
		Constructor<? extends phoneBase> constructor = c.getConstructor(new Class[] { Context.class, String.class });
		phoneBase phone = constructor.newInstance(new Object[] {context, cpuInfo} );
		return	phone;
	}
}


Я вынужден использовать рефлексию. Мне это не очень нравиться.
Прошу обсудить мое решение и если можете, предложите свое.
...
Рейтинг: 0 / 0
07.02.2013, 15:23:16
    #38141901
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Static abstract method
Почему метод isME должен быть статическим?
Замените статику синглтоном и ООП вернется на место.
...
Рейтинг: 0 / 0
07.02.2013, 15:31:09
    #38141921
Lisichkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Static abstract method
Blazkowicz
Я предполагаю, что каждый класс наследник "Телефон" должен обладать "самоидентификацией"

авторЗамените статику синглтоном и ООП вернется на место. А это как? :)
...
Рейтинг: 0 / 0
07.02.2013, 15:50:34
    #38141966
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Static abstract method
Что-то типа такого.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
abstract class PhoneFactory{
    Map<Model, ? extends PhoneFactory> factoryByModel = ...

    public static Phone newPhoneInstance(Model model){
             PhoneFactory modelFactory = factoryByModel.get(model);
             return modelFactory.createNewPhone();
    }

     public abstract Phone newPhoneInstance();
}

class  SamsungPhoneFactory extends PhoneFactory{
     public SamsungPhone newPhoneInstance(){
               return new SamsungPhone();
     }
}



Можно ещё генериков добавить по вкусу.
...
Рейтинг: 0 / 0
07.02.2013, 16:08:15
    #38141999
Лагман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Static abstract method
и соотв, isMe будет в PhoneFactory
...
Рейтинг: 0 / 0
07.02.2013, 16:14:32
    #38142017
0FD
0FD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Static abstract method
Lisichkin,

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
class phoneSamsung extends phoneBase{
  public static boolean _isMe(String cpuInfo){
     ....
  }
  //phoneBase::public abstract boolean isMe(String cpuInfo)
  public boolean isMe(String cpuInfo){
    return phoneSamsung._isMe(cpuInfo);
  }
}
...
Рейтинг: 0 / 0
07.02.2013, 16:37:55
    #38142067
Lisichkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Static abstract method
Т.е. в такой реализации не класс занимается "самоидентификацией" а фабрика...

Код: 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.
27.
28.
29.
30.
31.
32.
33.
34.
35.
public abstract class phoneFactory {
	
	private static Class<?>[] factory = {MTKFactory.class, ....};
	
	public static phoneBase getPhone(Context context, String cpuInfo) {
		for(Class c : factory) {
			// ОШИБКА: Cannot cast from Class to phoneFactory
			phoneFactory f = (phoneFactory)c;
			if (f.isMe(cpuInfo))
				return	f.newPhoneInstance(context, cpuInfo);
		}
	}
	
	abstract boolean isMe(String cpuInfo);
	abstract phoneBase newPhoneInstance(Context context, String cpuInfo);
	
	private static final Pattern mtkPattern = Pattern.compile("MT(\\d+).*");
	class  MTKFactory extends phoneFactory {

		@Override
		public boolean isMe(String cpuInfo) {
			String upper = cpuInfo.toUpperCase( Locale.getDefault() );
			boolean match = mtkPattern.matcher(upper).find();
			return	match;
		}

		@Override
		phoneBase newPhoneInstance(Context context, String cpuInfo) {
			return new phoneMTK(context, cpuInfo);
		}
		
	}

	.......
}


Что -то мне не удается скомпилировать :((
ОШИБКА: Cannot cast from Class to phoneFactory
...
Рейтинг: 0 / 0
07.02.2013, 16:46:18
    #38142101
Лагман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Static abstract method
Lisichkin, фабрики - экземпляры
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
interface Phone....

interface PhoneFactory {
boolean isMe();
Phone create();
}

class MTKFactory implements PhoneFactory....

private static PhoneFactory[] factory = {new MTKFactory(), ....};
...
Рейтинг: 0 / 0
07.02.2013, 16:59:20
    #38142132
Lisichkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Static abstract method
Всем большое спасибо!!!
Разобрался.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Static abstract method / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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