[英]How to Inject property values into a static property or method of an enum or normal class using Spring?
[英]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.