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

Имеется абстрактный класс "Телефон" и куча наследников от данного класса -
"Телефон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
Static abstract method
    #38141901
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему метод isME должен быть статическим?
Замените статику синглтоном и ООП вернется на место.
...
Рейтинг: 0 / 0
Static abstract method
    #38141921
Lisichkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz
Я предполагаю, что каждый класс наследник "Телефон" должен обладать "самоидентификацией"

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

Код: 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
Static abstract method
    #38141999
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и соотв, isMe будет в PhoneFactory
...
Рейтинг: 0 / 0
Static abstract method
    #38142017
0FD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Static abstract method
    #38142067
Lisichkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.е. в такой реализации не класс занимается "самоидентификацией" а фабрика...

Код: 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
Static abstract method
    #38142101
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Static abstract method
    #38142132
Lisichkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем большое спасибо!!!
Разобрался.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Static abstract method
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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