Как создать экземпляр объекта, привязанного к java enum

Я хочу создать экземпляр объекта для перечисления. Например:

public enum Type {

  TYPE1("type_name_1", new TypeObj1()), 
  TYPE2("type_name_2", new TypeObj2());

  TypeInterface typeObj;
  String value;
}
public class TypeObj1 implements TypeInterface {
  ...
}
public class TypeObj2 implements TypeInterface {
  ...
}

Это правильный способ сделать это? Я хочу, чтобы к перечислению был прикреплен один объект TypeInterface. Пожалуйста, предложите альтернативы.

Что вы подразумеваете под привязанным к перечислению? Может ли TYPE1 иметь TypeObj2, например?

davidalayachew 24.05.2023 17:31

Очень неясно, чего вы пытаетесь достичь. Помогает ли этот вопрос об использовании дженериков с перечислением? stackoverflow.com/a/11490505/721855

aled 24.05.2023 17:38

@davidalayachew нет, TYPE1 будет иметь только TypeObj1

Pandey 24.05.2023 17:58

@aled Я хотел знать, правильный ли подход, который я использую, или нет. Я хотел бы создать экземпляр объекта класса, реализующего TypeInterface в конструкторе Enum. Это правильная практика?

Pandey 24.05.2023 18:01

Тогда мой следующий вопрос, вы сказали, что TYPE1 может взаимодействовать только с TypeObj1. Это то, что вы хотите применить компилятором? Или вы просто хотите отобразить отношения и посмотреть, есть ли лучший способ сделать это?

davidalayachew 24.05.2023 18:05
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
5
52
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Создайте конструктор для вашего enum, который соответствует аргументам, которые вы указываете.
Нет модификатора доступа; и private является избыточным.

Типы Enum (Учебные руководства по Java™ > Изучение языка Java > Классы и объекты).

public enum Type {
    TYPE1("type_name_1", new TypeObj1()),
    TYPE2("type_name_2", new TypeObj2());

    final TypeInterface typeObj;
    final String value;
    
    Type(String value, TypeInterface typeObj) {
        this.value = value;
        this.typeObj = typeObj;
    }
}
Ответ принят как подходящий

Да, вы движетесь в правильном направлении.

Вам понадобится конструктор для назначения переданных объектов вашим полям-членам.

Сделайте свои поля-члены final, чтобы предотвратить их переназначение другой ссылке на объект.

public enum Type {
  // Enum objects.
  TYPE1("type_name_1", new TypeObj1()), 
  TYPE2("type_name_2", new TypeObj2());

  // Member fields.
  final TypeInterface typeObj;
  final String value;

  // Constructor.
  Type( final String value , final TypeInterface typeInterface ) {
    this.typeObj = typeInterface ;
    this.value = value ;
  }
}

Совет: Этот вид мыслительного упражнения будет более ясным и продуктивным, если вы придумаете простой, но полуреалистичный сценарий, а не свои аморфные «TypeInterface» и «значение».

public enum Pet {
  // Enum objects.
  FLUFFY( "tuxedo" , new Cat() ), 
  ROVER( "chocolate Lab" , new Dog() );
  
  // Member fields.
  final Animal animal;
  final String description;

  // Constructor.
  Type( final String desc , final Animal animal ) {
    this.animal = animal ;
    this.description = desc ;
  }
}

Другие вопросы по теме