JAVA - передача обобщенного c перечисления в качестве параметра метода для конструктора - PullRequest
0 голосов
/ 10 июля 2020

У меня есть три разных типа перечислений (itemsA, itemsB и items C) и класс «Product». Пока я передаю одно перечисление в качестве параметра для своего конструктора продукта, имеющего три конструктора:

static Product actualProduct;
        
public static void setActualProduct(itemsA currentProduct) {
                actualProduct = new Product(currentProduct);
        
public static void setActualProduct(itemsB currentProduct) {
                actualProduct = new Product(currentProduct);
        
public static void setActualProduct(itemsC currentProduct) {
                actualProduct = new Product(currentProduct);

класс Product

public class Product {
    private String productId;
    private String name;

    public Product(itemsA item) {
            this.productId = item.getId();
            this.name = item.getProductName();
     }
    
    public Product(itemsB item) {
            this.productId = item.getId();
            this.name = item.getProductName();
            this.category = item.getCategory();
    }
    
    public Product(itemsC item) {
            this.productId = item.getId();
            this.name = item.getProductName();
    }

Пример перечисления: itemsA

public enum itemsA{

    item1("00001", "itemName", BuySections.TOYS);

    private final String id;
    private final String productName;
    private final BuySections section;

    item1(String id, String name, BuySections section){
        this.id = id;
        this.productName = name;
        this.section = section;
    }

    public String getProductName(){
        return productName;
    }

Итак, я думаю, что должен быть способ реализовать это, используя некоторые обобщения. Примерно так:

public static void setActualProduct(Enum<?> itemType) {
            actualProduct = new Product<?>(itemType);

Любая помощь будет очень принята.

Ответы [ 3 ]

1 голос
/ 10 июля 2020

Да, это возможно. вы можете сделать enum реализацией обычного interface и создать конструктор, используя interface. Ниже приведен пример

interface GenericEnum{}

enum Item1 implements GenericEnum {
   TOYS1;
}

enum Item2 implements GenericEnum {
   TOYS2;
}


class Test {
  public GenericEnum genericEnum;

  public Test(GenericEnum genericEnum) {
     this.genericEnum = genericEnum;
  }

}
1 голос
/ 10 июля 2020

Вы можете позволить своим перечислениям реализовать общий интерфейс:

interface CommonInterface {
    public String getId();
    public String getProductName();
    public BuySection getBuySection();
}
enum FstEnum implements CommonInterface {}
enum SndEnum implements CommonInterface {}

class Product<E extends Enum<E> & CommonInterface> {
    E type;
    Product(E type) {
        this.type = type;
    }
}

public static <E extends Enum<E> & CommonInterface> void setActualProduct(E itemType) {
        actualProduct = new Product<E>(itemType);
}

Несколько замечаний по поводу. соглашения об именах: имена классов должны быть в единственном числе (BuySection, а не BuySections), перечисления должны начинаться с заглавных букв (как и все типы, например, ItemsA, а не itemsA)

0 голосов
/ 10 июля 2020

Я не понимаю, почему вы определяете разные перечисления, содержащие только отдельные значения, вместо того, чтобы определять одно перечисление, содержащее разные значения. Примерно так:

public enum Item {

    item1("00001", "itemName", BuySections.TOYS),
    item2("00002", "itemName2", BuySections.TOYS),
    item3("00003", "itemName3", BuySections.TOYS);

    private final String id;
    private final String productName;
    private final BuySections section;

    Item(String id, String name, BuySections section){
        this.id = id;
        this.productName = name;
        this.section = section;
    }

    public String getProductName(){
        return productName;
    }
}
...