簡體   English   中英

如何將屬性值注入枚舉?

[英]How to inject property values into enum?

我正在使用Spring來解析屬性文件中的屬性值,通常使用@Value("${my.property}")

現在我有一個應該具有應用程序范圍的可配置靜態數字的枚舉。 例如:

public enum PersonType {
    ADULT, CHILD;
    private static final int MAX_CHILD = 17;

    public static PersonType fromAge(int age) {
        return age <= MAX_CHILD ? CHILD : ADULT;
    }
}

我怎樣才能讓Spring的最大孩子年齡可配置和注射?

這是一個有趣的問題,如何處理對於類的所有對象都相同的變量,並且在運行時不會更改,同時允許在執行之間配置。 由於前兩個先決條件規定變量應該是靜態的和最終的(例如常量),第三個實際上不適合,這意味着沒有很好的方法來實現所有三個(需要反射,或者必須放棄靜態約束或最終約束)。

由於現在對事物的建模方式沒有很好的解決方案,我認為最明智的做法是退后一步並重新考慮變量的位置:是否有必要將此邏輯保留在枚舉本身中? 更改常量,枚舉本身或其他內容的值有什么不同? 在什么情況下,這個常數必須改變它的價值?

在您的示例中,可能是不同的國家/地區對於被視為成人的閾值具有不同的閾值,或者閾值發生變化,那么可能是確定Person具有哪種PersonType的小型服務是正確的方法。

@Service
public class PersonTypeService {
    @Value("${threshold.for.adulthood}")
    private int thresholdForAdulthood;

    public PersonType determinePersonType(final Person person) {
        if (person.getAge() >= thresholdForAdulthood) {
            return PersonType.ADULT;
        }
        return PersonType.CHILD;
    }  
}

一般來說,我喜歡讓enums只回答“what”,並將“how”和“why”留給域類和服務。 在該示例中,所有枚舉需要知道的是它為人提供的值,為什么它應該提供某個值,或者如何確定它,不屬於枚舉。

根據可配置的年齡移動邏輯以獲得適當的枚舉可以是解決方案之一

class PersonTypeFinder
{
    private int maxChildAge; // set this from spring
    ....

   public PersonType getPersonType(int age)
   {
     return age <= maxChildAge ? PersonType.CHILD : PersonType.ADULT;
   }
}

enum PersonType 
{
   ADULT, CHILD;
}

暫無
暫無

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

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