簡體   English   中英

如何通過函數傳遞枚舉定義並在java中訪問其成員?

[英]How to pass enum definition through a function and access its members there in java?

我正在使用mongodb並進行數據驗證我正在嘗試使用java枚舉。 我在枚舉中定義了db schema,並嘗試通過validationFunction傳遞該枚舉和實際數據。

枚舉定義如下。

//Enum definition
public enum Type {
  STRING, OBJECT, INTEGER    
}

public enum Existence {
  REQUIRED, OPTIONAL
}

public enum Adress {
  HOUSE_NO("houseNo", Type.STRING, Existence.REQUIRED),
  STREET_NO("streetNo", Type.STRING, Existence.REQUIRED),
  LANDMARK("landmark", Type.STRING, Existence.OPTIONAL)
      public enum employeeSchema {
  NAME("name", Type.STRING, Existence.REQUIRED),
  AGE("age", Type.INTEGER, Existence.Optional),
  ADDRESS("address", Type.OBJECT, Existence.REQUIRED)

  String text;
  Type valueType;
  Existence exist;
  Address(String text, Type valueType, Existence exist) {
    this.text = text;
    this.valueType = valueType;
    this.exist = exist;
  }
}

public enum employeeSchema {
  NAME("name", Type.STRING, Existence.REQUIRED),
  AGE("age", Type.INTEGER, Existence.Optional),
  ADDRESS("address", Type.OBJECT, Existence.REQUIRED, Address)

  String text;
  Type valueType;
  Existence exist;
  employeeSchema(String text, Type valueType, Existence exist) {
    this.text = text;
    this.valueType = valueType;
    this.exist = exist;
  }
  employeeSchema(String text, Type valueType, Existence exist, Enum schema) {
    this.text = text;
    this.valueType = valueType;
    this.exist = exist;
    this.schema = schema;
  }
}

現在我想通過一個函數傳遞employeeSchema來驗證數據。

public boolean validateData(JsonNode data, Enum schema){
  //Want to iterate the enum here. Get the corresponding field from the data and will check if the field has type required and if its null it will return false. Again if the field would be object this function would be called with respective schema.
}

所以問題是,我想通過函數傳遞枚舉,但需要具有泛型返回類型,因為當我在Enum類型中收集它時,它沒有相應的枚舉值。

例如,如果我傳遞employeeSchema並執行employeeSchema.text,則表示Enum類型沒有文本。

我希望我的問題很清楚。 提前致謝。

我對您的代碼的想法如下:

  1. 使Type成為一個類並將其與schema字段合並。

  2. 使接口像Field ,並使所有枚舉實現它:

這是Field界面:

public interface Field {
    String getText();
    Type getType();
    Existence getExistence();
}

這是更新的Type類:

public static final class Type {
    // predefined primitive types
    public static final Type INTEGER = new Type(Integer.class);
    public static final Type STRING = new Type(String.class);

    private final Class<?> clazz;

    private Type(Class<?> clazz) {
        this.clazz = clazz;
    }

    // Object types are created by this constructor     
    public static Type of(Class<? extends Field> fieldClass) {
        return new Type(fieldClass);
    }

    @Override
    public int hashCode() {
        return clazz.hashCode();
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null || getClass() != obj.getClass())
            return false;
        return clazz.equals(((Type) obj).clazz);
    }

    public Class<?> getValueClass() {
        return clazz;
    }

    // retrieve all possible Fields for given object type
    public Field[] values() {
        if(Field.class.isAssignableFrom(clazz)) {
            return clazz.asSubclass(Field.class).getEnumConstants();
        }
        return null;
    }
}

這是您更新的枚舉:

public enum Address implements Field {
    HOUSE_NO("houseNo", Type.STRING, Existence.REQUIRED), 
    STREET_NO("streetNo", Type.STRING, Existence.REQUIRED), 
    LANDMARK("landmark", Type.STRING, Existence.OPTIONAL);

    String text;
    Type valueType;
    Existence exist;

    @Override
    public String getText() {
        return text;
    }

    @Override
    public Type getType() {
        return valueType;
    }

    @Override
    public Existence getExistence() {
        return exist;
    }

    Address(String text, Type valueType, Existence exist) {
        this.text = text;
        this.valueType = valueType;
        this.exist = exist;
    }
}

public enum employeeSchema implements Field {
    NAME("name", Type.STRING, Existence.REQUIRED), 
    AGE("age", Type.INTEGER, Existence.OPTIONAL), 
    ADDRESS("address", Type.of(Address.class), Existence.REQUIRED);

    String text;
    Type valueType;
    Existence exist;

    employeeSchema(String text, Type valueType, Existence exist) {
        this.text = text;
        this.valueType = valueType;
        this.exist = exist;
    }

    @Override
    public String getText() {
        return text;
    }

    @Override
    public Type getType() {
        return valueType;
    }

    @Override
    public Existence getExistence() {
        return exist;
    }
}

因此,在validateData您應該接受Type並獲取此類型的所有可能值:

public boolean validateData(JsonNode data, Type type){
    Field[] values = type.values();
    if(values != null) {
        for(Field field : values) {
           ... // use field.getText()/field.getType()/etc. to validate
           // probably it's ok to call recursively here
           // validateData(data.get(field.getText()), field.getType());
        }
    } else {
        Class<?> clazz = type.getValueClass();
        // clazz is a simple type like Integer or String
    }
}

Enum類表示泛型類型的單個枚舉常量; 所以NAME ,在你的例子中。 你想要的是:

public boolean validateData(JsonNode data, Class<? extends Enum> schema) {
  for (Enum<?> e : schema.getEnumConstants()) {
    ...
  }
}

然后你打電話

validateData(data, Adress.class);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM