Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / enum - подмножества для множества. / 17 сообщений из 17, страница 1 из 1
21.11.2006, 19:08:28
    #34144969
pamir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
enum - подмножества для множества.
Возможно ли с помощью enum реализовать следующее поведение.
Предположим, что у нас есть некоторое множество значений - результаты прогноза (1, X, 2 - победа, ничья, поражение).
И есть более широкое множество - Результаты реального матча (1, Х, 2, перенесен, отменен, отложен, результат не учитывается...)
Желание связано с тем, что поля, содержащие прогноз, должны быть ограничены в значениях (нельзя прогнозировать перенесение или отмену матча), но с другой стороны хотелось бы иметь возможность сравнивать поле прогноза и поле реального результата без дополнительных усилий (т.е. специально написанных для этого методов).
enum наследовать нельзя. Перекрыть метод equals тоже - он final.
Отсюда и вопрос - как?
1. писать myEquals - немного не красиво как-то
2. забить на enum и писать собственный класс для реализации перечислимого типа - не логично - из-за некрасивости первого пункта писать полностью свой класс.
Как правильно?
...
Рейтинг: 0 / 0
21.11.2006, 19:28:51
    #34145016
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
enum - подмножества для множества.
Как на счет такого варианта?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 public  enum TestSubEnum
{
    a,b,c,d;

     private   static   final  TestSubEnum[] TEST_SUB_ENUM =  new  TestSubEnum[] {a, b};

     public  TestSubEnum[] subEnum() 
    {
         return  TEST_SUB_ENUM; 
    }
}
...
Рейтинг: 0 / 0
22.11.2006, 01:07:48
    #34145349
pamir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
enum - подмножества для множества.
Извиняюсь за назойливость. Можно пояснения?
Не совсем понял, как это применить.
Сам класс TestSubEnum является полным набором. Я могу сделать в каком-нибудь классе поле этого типа.
А вот что делать с subEnum? Он возвращает разрешенный набор для подмножества, но что с ним делать?
...
Рейтинг: 0 / 0
22.11.2006, 09:44:44
    #34145660
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
enum - подмножества для множества.
А что ты хочешь с ним делать? Он же тебе для чего-то понадобился? Константы ты можешь использовать из исходного энума, а итернацию по массиву подмножеству, какая тебе ещё функциональность нужна?
...
Рейтинг: 0 / 0
22.11.2006, 11:14:35
    #34146006
pamir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
enum - подмножества для множества.
BlazkowiczА что ты хочешь с ним делать? Он же тебе для чего-то понадобился? Константы ты можешь использовать из исходного энума, а итернацию по массиву подмножеству, какая тебе ещё функциональность нужна?
Я хочу иметь поле такого типа, который не позволит мне присвоить ему "невозможное" значение. Ну чисто для красоты. Так-то я и int мог бы использовать, но вот захотелось красивого.
Есть у меня одна мысль (вычитал про один паттерн), я ее попробую, если получится - здесь выложу. Там без enum.
...
Рейтинг: 0 / 0
22.11.2006, 11:17:13
    #34146017
pamir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
enum - подмножества для множества.
pamirЯ хочу иметь поле такого типа, который не позволит мне присвоить ему "невозможное" значение. Ну чисто для красоты.
Да, и при этом позволит без усилий сравнивать значения с более широким множеством.

Фактически, как я уже писал в первом сообщении - есть множество А, которая является подмножеством Б. Вот я и хочу получить класс А и класс Б, чтобы можно было делать поля таких типов.
Наверное, это больше теоретическая заморочка, чем практическая.
...
Рейтинг: 0 / 0
22.11.2006, 12:35:41
    #34146399
pamir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
enum - подмножества для множества.
Вот вариант - подчерпнул из главы Замена перечислений классами

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
 public   class  PrognozResult {
	 private   static   int  counter =  0 ;
	 private   final   int  id;
	 protected  PrognozResult(){
		id = counter;
		counter++;
	}
	 public  String toString() {  return  String.valueOf( this .id); }
	
	 public   static   final  PrognozResult HOME_WIN =  new  PrognozResult();  
	 public   static   final  PrognozResult DRAW =  new  PrognozResult();
	 public   static   final  PrognozResult HOME_LOSE =  new  PrognozResult();
}

Код: plaintext
1.
2.
3.
 public   class  MatchResult  extends  PrognozResult {
	 public   static   final  MatchResult NOT_CONSIDERED  =  new  MatchResult();  
	 public   static   final  MatchResult MATCH_POSTP  =  new  MatchResult();  
}

В принципе, работает, за одним недостатком (если его можно так назвать) - для класса, который будет обслуживать матчи (т.е. класс, который может содержать более широкий диапазон значений), поле результата нужно все равно делать типа PrognozResult иначе возникает ошибка преобразования класса, для первых 3х значений. Кажется, это не является недостатком - просто все поля идут корневым классом.

Все верно или где-то я что-то не заметил?
...
Рейтинг: 0 / 0
22.11.2006, 12:43:17
    #34146423
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
enum - подмножества для множества.
pamirВсе верно или где-то я что-то не заметил?

Какая-то неоднозначная реализация энумов. А как по ним итерироватся и все такое?
Возьми лучше что-нибудь из Jakarta Commons Lang:
org.apache.commons.lang.enums.*
...
Рейтинг: 0 / 0
22.11.2006, 13:05:37
    #34146515
pamir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
enum - подмножества для множества.
Эээ... А зачем мне по ним итерироваться? И как итерироваться по обычному enum? Не нашел у него никаких методов для этого.
...
Рейтинг: 0 / 0
22.11.2006, 18:52:45
    #34148099
pamir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
enum - подмножества для множества.
pamirВсе верно или где-то я что-то не заметил?
И тут до меня дошло, что я ничего этим не добился. Поле типа PrognozResult может содержать в себе значения и дочернего класса PrognozResult, что вполне логично.
Так что задача не решена.
...
Рейтинг: 0 / 0
22.11.2006, 18:53:58
    #34148103
pamir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
enum - подмножества для множества.
"дочернего класса PrognozResult" читать как "дочернего класса MatchResult"
...
Рейтинг: 0 / 0
23.11.2006, 06:15:47
    #34148678
LINUXER
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
enum - подмножества для множества.
pamir pamirВсе верно или где-то я что-то не заметил?
И тут до меня дошло, что я ничего этим не добился. Поле типа PrognozResult может содержать в себе значения и дочернего класса PrognozResult, что вполне логично.
Так что задача не решена.
Не понял - в каком случае может содержать?
По-моему хороший вариант, для описанной желаемой функциональности
...
Рейтинг: 0 / 0
23.11.2006, 11:30:40
    #34149398
pamir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
enum - подмножества для множества.
LINUXER pamirИ тут до меня дошло, что я ничего этим не добился. Поле типа PrognozResult может содержать в себе значения и дочернего класса PrognozResult, что вполне логично.
Так что задача не решена.
Не понял - в каком случае может содержать?
По-моему хороший вариант, для описанной желаемой функциональности
Идея была в следующем (на примере)
Класс MyPrognozHolder - содержит прогнозы матчей. Его поля должны быть такого типа, которые не позволят присвоить им ничего кроме Победа, ничья, Поражение (т.е. типа PrognozResult).
Класс MyRealResultsHolder - содержит реальные результаты матчей - его поля должны быть такого типа, который позволяет присваивать не только Победа, ничья, Поражение, но и Отменен, Перенесен, Не Учитывать (т.е. типа MatchResult).
При этом хотелось бы, чтобы их можно было сравнивать без спец. преобразований.
Приведенное мной решение состоит из класса PrognozResult и унаследованного от него MatchResult. Такое положение позволяет присвоить полям с типом PrognozResult все! значения, которые возможны в MatchResult:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
		PrognozResult prHW = PrognozResult.HOME_WIN; 
		PrognozResult prD = PrognozResult.DRAW; 
		PrognozResult prHL = PrognozResult.HOME_LOSE; 
		PrognozResult mHW = MatchResult.HOME_WIN; 
		PrognozResult mD = MatchResult.DRAW; 
		PrognozResult mHL = MatchResult.HOME_LOSE; 
		PrognozResult mNC = MatchResult.NOT_CONSIDERED; 
		PrognozResult mP = MatchResult.MATCH_POSTP; 
Следовательно, задача ограничения не решена - поля типа PrognozResult могут получать значения MatchResult.NOT_CONSIDERED и MatchResult.MATCH_POSTP, более того, полю типа MatchResult невозможно присвоить значения MatchResult.HOME_WIN, MatchResult.DRAW, MatchResult.HOME_LOSE не проведя преобразование к типу MatchResult, т.к. они пришли еще от родителя.
В итоге я решил делать проверку в самом классе (в примере это MyPrognozHolder) в методе set для соответствующего поля.

PS. А приведенное мной решение полезное, но для других целей. Для расширяемых перечислительных типов, но когда не стоит требование ограничений.
...
Рейтинг: 0 / 0
23.11.2006, 12:07:16
    #34149631
LINUXER
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
enum - подмножества для множества.
pamir
Код: plaintext
1.
2.
		PrognozResult mNC = MatchResult.NOT_CONSIDERED; 
		PrognozResult mP = MatchResult.MATCH_POSTP; 

точно=))
...
Рейтинг: 0 / 0
23.11.2006, 12:31:59
    #34149759
pamir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
enum - подмножества для множества.
Кстати, подумалось - так как у enum нельзя перекрыть метод equals, то если очень хотеть все-таки решить задачу, можно сделать классы PrognozResult и MatchResult независимыми, и в каждом реализовать метод equals.
И почему я сразу об этом не подумал? :о)
...
Рейтинг: 0 / 0
23.11.2006, 13:52:32
    #34150161
pamir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
enum - подмножества для множества.
pamirКстати, подумалось - так как у enum нельзя перекрыть метод equals, то если очень хотеть все-таки решить задачу, можно сделать классы PrognozResult и MatchResult независимыми, и в каждом реализовать метод equals.
И почему я сразу об этом не подумал? :о)
Тихо сам с собою... я же никому не мешаю :))

Такой вариант возможен, но для частного случая. Он работает, но если вдруг появится еще какой-то набор значений (трудно привести пример для прогнозов, но если это другая область применения, то можно), то эти классы не сумеют с ним сравниваться.... Так что решение половинчатое.
...
Рейтинг: 0 / 0
23.11.2006, 15:25:51
    #34150599
NotGonnaGetUs
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
enum - подмножества для множества.
pamirТихо сам с собою... я же никому не мешаю :))

Ты пытаешься смешать разные понятия в одну кучу.

Будь проще:
Код: plaintext
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.
enum Result {
    WIN, DRAW, LOSS, CANCELED, etc...
}

 interface  Forecast {
     boolean  isMatch(Result result);
}

 class  Win  implements  Forecast {
     public   boolean  isMatch(Result result) {
         return  result == Result.WIN;
    }
}

 class  Loss  implements  Forecast {
     public   boolean  isMatch(Result result) {
         return  result == Result.LOSS;
    }
}

 class  Draw  implements  Forecast {
     public   boolean  isMatch(Result result) {
         return  result == Result.DRAW;
    }
}

//usage

Forecast myForecast =  new  Win();

Result result = getResult("MatchName");

 boolean  isCorrectForecast = myForecast.isMatch(result);
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / enum - подмножества для множества. / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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