Last active
March 23, 2018 04:10
-
-
Save tkrkt/77096bbcf3e19b5ded7e923efc09e7ca to your computer and use it in GitHub Desktop.
[Java] I want to write more elegantly
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.util.HashMap; | |
public class NumberMap { | |
HashMap<String, Number> map = new HashMap<>(); | |
public void put(String key, Number value) { | |
if (value instanceof Double | |
|| value instanceof Float | |
|| value instanceof Integer | |
|| value instanceof Long | |
|| value instanceof Short) { | |
map.put(key, value); | |
} else { | |
throw new RuntimeException("NumberMap does not support BigDecimal, BigInteger and Byte."); | |
} | |
} | |
public <T extends Number> T get1(String key, T defaultValue) { | |
Number ret = map.get(key); | |
if (ret == null) { | |
return defaultValue; | |
} else { | |
return (T)ret; | |
} | |
} | |
public <T extends Number> T get2(String key, T defaultValue) { | |
Number ret = map.get(key); | |
if (ret == null) { | |
return defaultValue; | |
} else if (defaultValue.getClass().isInstance(ret)) { | |
return (T)ret; | |
} else if (defaultValue instanceof Double) { | |
return (T)((Double)ret.doubleValue()); | |
} else if (defaultValue instanceof Float) { | |
return (T)((Float)ret.floatValue()); | |
} else if (defaultValue instanceof Integer) { | |
return (T)((Integer)ret.intValue()); | |
} else if (defaultValue instanceof Long) { | |
return (T)((Long)ret.longValue()); | |
} else if (defaultValue instanceof Short) { | |
return (T)((Short)ret.shortValue()); | |
} else { | |
throw new RuntimeException("defaultValue must be double|float|int|long|short."); | |
} | |
} | |
public double get3(String key, double defaultValue) { | |
Number ret = map.get(key); | |
if (ret == null) { | |
return defaultValue; | |
} else { | |
return ret.doubleValue(); | |
} | |
} | |
public float get3(String key, float defaultValue) { | |
Number ret = map.get(key); | |
if (ret == null) { | |
return defaultValue; | |
} else { | |
return ret.floatValue(); | |
} | |
} | |
public int get3(String key, int defaultValue) { | |
Number ret = map.get(key); | |
if (ret == null) { | |
return defaultValue; | |
} else { | |
return ret.intValue(); | |
} | |
} | |
public long get3(String key, long defaultValue) { | |
Number ret = map.get(key); | |
if (ret == null) { | |
return defaultValue; | |
} else { | |
return ret.longValue(); | |
} | |
} | |
public short get3(String key, short defaultValue) { | |
Number ret = map.get(key); | |
if (ret == null) { | |
return defaultValue; | |
} else { | |
return ret.shortValue(); | |
} | |
} | |
public static void main(String[] args) { | |
NumberMap map = new NumberMap(); | |
map.put("double", 1.0d); | |
map.put("int", 1); | |
// NG - java.lang.ClassCastException: | |
// java.lang.Integer cannot be cast to java.lang.Double | |
double doubleGet1 = map.get1("int", 1.0d); | |
// NG - java.lang.ClassCastException: | |
// java.lang.Double cannot be cast to java.lang.Integer | |
int intGet1 = map.get1("double", 1); | |
// OK | |
double doubleGet2 = map.get2("int", 1.0d); | |
// OK | |
int intGet2 = map.get2("double", 1); | |
// OK | |
double doubleGet3 = map.get3("int", 1.0d); | |
// OK | |
int intGet3 = map.get3("double", 1); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment