powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / enum - подмножества для множества.
17 сообщений из 17, страница 1 из 1
enum - подмножества для множества.
    #34144969
Фотография pamir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможно ли с помощью enum реализовать следующее поведение.
Предположим, что у нас есть некоторое множество значений - результаты прогноза (1, X, 2 - победа, ничья, поражение).
И есть более широкое множество - Результаты реального матча (1, Х, 2, перенесен, отменен, отложен, результат не учитывается...)
Желание связано с тем, что поля, содержащие прогноз, должны быть ограничены в значениях (нельзя прогнозировать перенесение или отмену матча), но с другой стороны хотелось бы иметь возможность сравнивать поле прогноза и поле реального результата без дополнительных усилий (т.е. специально написанных для этого методов).
enum наследовать нельзя. Перекрыть метод equals тоже - он final.
Отсюда и вопрос - как?
1. писать myEquals - немного не красиво как-то
2. забить на enum и писать собственный класс для реализации перечислимого типа - не логично - из-за некрасивости первого пункта писать полностью свой класс.
Как правильно?
...
Рейтинг: 0 / 0
enum - подмножества для множества.
    #34145016
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как на счет такого варианта?
Код: 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
enum - подмножества для множества.
    #34145349
Фотография pamir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извиняюсь за назойливость. Можно пояснения?
Не совсем понял, как это применить.
Сам класс TestSubEnum является полным набором. Я могу сделать в каком-нибудь классе поле этого типа.
А вот что делать с subEnum? Он возвращает разрешенный набор для подмножества, но что с ним делать?
...
Рейтинг: 0 / 0
enum - подмножества для множества.
    #34145660
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что ты хочешь с ним делать? Он же тебе для чего-то понадобился? Константы ты можешь использовать из исходного энума, а итернацию по массиву подмножеству, какая тебе ещё функциональность нужна?
...
Рейтинг: 0 / 0
enum - подмножества для множества.
    #34146006
Фотография pamir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczА что ты хочешь с ним делать? Он же тебе для чего-то понадобился? Константы ты можешь использовать из исходного энума, а итернацию по массиву подмножеству, какая тебе ещё функциональность нужна?
Я хочу иметь поле такого типа, который не позволит мне присвоить ему "невозможное" значение. Ну чисто для красоты. Так-то я и int мог бы использовать, но вот захотелось красивого.
Есть у меня одна мысль (вычитал про один паттерн), я ее попробую, если получится - здесь выложу. Там без enum.
...
Рейтинг: 0 / 0
enum - подмножества для множества.
    #34146017
Фотография pamir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pamirЯ хочу иметь поле такого типа, который не позволит мне присвоить ему "невозможное" значение. Ну чисто для красоты.
Да, и при этом позволит без усилий сравнивать значения с более широким множеством.

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

Код: 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
enum - подмножества для множества.
    #34146423
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pamirВсе верно или где-то я что-то не заметил?

Какая-то неоднозначная реализация энумов. А как по ним итерироватся и все такое?
Возьми лучше что-нибудь из Jakarta Commons Lang:
org.apache.commons.lang.enums.*
...
Рейтинг: 0 / 0
enum - подмножества для множества.
    #34146515
Фотография pamir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эээ... А зачем мне по ним итерироваться? И как итерироваться по обычному enum? Не нашел у него никаких методов для этого.
...
Рейтинг: 0 / 0
enum - подмножества для множества.
    #34148099
Фотография pamir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pamirВсе верно или где-то я что-то не заметил?
И тут до меня дошло, что я ничего этим не добился. Поле типа PrognozResult может содержать в себе значения и дочернего класса PrognozResult, что вполне логично.
Так что задача не решена.
...
Рейтинг: 0 / 0
enum - подмножества для множества.
    #34148103
Фотография pamir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"дочернего класса PrognozResult" читать как "дочернего класса MatchResult"
...
Рейтинг: 0 / 0
enum - подмножества для множества.
    #34148678
LINUXER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pamir pamirВсе верно или где-то я что-то не заметил?
И тут до меня дошло, что я ничего этим не добился. Поле типа PrognozResult может содержать в себе значения и дочернего класса PrognozResult, что вполне логично.
Так что задача не решена.
Не понял - в каком случае может содержать?
По-моему хороший вариант, для описанной желаемой функциональности
...
Рейтинг: 0 / 0
enum - подмножества для множества.
    #34149398
Фотография pamir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
enum - подмножества для множества.
    #34149631
LINUXER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pamir
Код: plaintext
1.
2.
		PrognozResult mNC = MatchResult.NOT_CONSIDERED; 
		PrognozResult mP = MatchResult.MATCH_POSTP; 

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

Такой вариант возможен, но для частного случая. Он работает, но если вдруг появится еще какой-то набор значений (трудно привести пример для прогнозов, но если это другая область применения, то можно), то эти классы не сумеют с ним сравниваться.... Так что решение половинчатое.
...
Рейтинг: 0 / 0
enum - подмножества для множества.
    #34150599
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
17 сообщений из 17, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / enum - подмножества для множества.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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