簡體   English   中英

Java 如果 Number 是 null,是否有任何優雅的方法可以為 Number 分配默認值

[英]Java Is there any elegant way to assign a default value to Number if that Number is null

有沒有辦法為 Number 的派生 class 分配默認值,可以通過 int 傳遞?

我正在尋找一個實現:

public <N extends Number> N getNumberWithDefault( N number, int defaultNumber );

我知道這很容易:

public <N extends Number> N getNumberWithDefault(N number, Class<N> clazz, String defaultNumber) {
    N result = number;
    if (result == null) {
        try {
            result = clazz.cast(clazz.getDeclaredMethod("valueOf", String.class).invoke(null, defaultNumber));
        } catch (Exception ex) {
            LOGGER.error("Error assigning default", ex);
        }
    }
    return result;
}

但它似乎一點也不優雅。 有什么辦法可以改善嗎?

更新

我想知道的是是否可以做到這樣的事情:

public <N extends Number> N getNumberWithDefault( N number ) {
    return getNumberWithDefault( number, 1 );
}

然后,相同的 function (getNumberWithDefault(number)) 可用於所有類。

雖然我認為這種方式在 Java 中是不可能的

類型安全的方法雖然不優雅,但使用重載代替 generics。

優點是如果需要,默認值可以是非int

public Byte getNumberWithDefault(Byte number, int defaultNumber) {
    return (number != null ? number : Byte.valueOf((byte) defaultNumber));
}
public Short getNumberWithDefault(Short number, int defaultNumber) {
    return (number != null ? number : Short.valueOf((short) defaultNumber));
}
public Integer getNumberWithDefault(Integer number, int defaultNumber) {
    return (number != null ? number : Integer.valueOf(defaultNumber));
}
public Long getNumberWithDefault(Long number, long defaultNumber) {
    return (number != null ? number : Long.valueOf(defaultNumber));
}
public Float getNumberWithDefault(Float number, float defaultNumber) {
    return (number != null ? number : Float.valueOf(defaultNumber));
}
public Double getNumberWithDefault(Double number, double defaultNumber) {
    return (number != null ? number : Double.valueOf(defaultNumber));
}
public BigInteger getNumberWithDefault(BigInteger number, long defaultNumber) {
    return (number != null ? number : BigInteger.valueOf(defaultNumber));
}
public BigDecimal getNumberWithDefault(BigDecimal number, double defaultNumber) {
    return (number != null ? number : BigDecimal.valueOf(defaultNumber));
}

更新

對於更新后的問題,默認值被硬編碼為1 ,答案是相同的。

public Byte getNumberWithDefault(Byte number) {
    return (number != null ? number : Byte.valueOf((byte) 1));
}
public Short getNumberWithDefault(Short number) {
    return (number != null ? number : Short.valueOf((short) 1));
}
public Integer getNumberWithDefault(Integer number) {
    return (number != null ? number : Integer.valueOf(1));
}
public Long getNumberWithDefault(Long number) {
    return (number != null ? number : Long.valueOf(1L));
}
public Float getNumberWithDefault(Float number) {
    return (number != null ? number : Float.valueOf(1f));
}
public Double getNumberWithDefault(Double number) {
    return (number != null ? number : Double.valueOf(1d));
}
public BigInteger getNumberWithDefault(BigInteger number) {
    return (number != null ? number : BigInteger.ONE);
}
public BigDecimal getNumberWithDefault(BigDecimal number) {
    return (number != null ? number : BigDecimal.ONE);
}

我認為解決此問題的唯一方法是將方法的簽名更改為

public <N extends Number> N getNumberWithDefault( N number, N defaultNumber )

也就是說,defaultNumber 必須與 number 的類型相同。

當然,那么它很簡單:

public <N extends Number> N getNumberWithDefault( N number, N defaultNumber ){
   return number != null ? number : defaultNumber;
}

暫無
暫無

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

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