我做了我的评论代码工作,不知何故,当看到来自我的同事的这个片段时我感到非常不舒服:
public class ArrayUtil {
public static List<Integer> joinList(List<Integer> list, Integer data) {
list.add(data == null ? 0 : data);
return list;
}
public static List<Long> joinList(List<Long> list, Long data) {
list.add(data == null ? 0 : data);
return list;
}
public static List<Double> joinList(List<Double> list, Double data) {
list.add(data == null ? 0.00 : data);
return list;
}
public static List<String> joinList(List<String> list, String data) {
list.add(StringUtils.isEmpty(data) ? "-" : data);
return list;
}
}
我想使用java泛型来重新编码这个Snippet, 但似乎没有正确的方法来重新编码这个片段,
答案 0 :(得分:1)
由于默认值,您将遇到泛型问题。
对于整数/长/日变体,您可以使用...
public class ArrayUtil {
public static <T> List<T> joinList(List<T> list, T data, T defaultValue) {
list.add(data == null ? defaultValue : data);
return list;
}
}
...但现在要求调用代码传递默认值是否有所改进?这并没有处理字符串的空检查,所以我认为代码越来越差而不是更好。
如果是我,我会保留代码原样。
答案 1 :(得分:0)
虽然@haggisandchips有一个很好的答案,但仍有一些事情可以改进!
该方法的命名并不十分清晰,请将其命名为saveAdd
而不是joinList
,因为joinList
听起来更像是要追加列表给另一个......
您不必返回list
,因为它是参考类型!
我还建议您返回boolean
而不是实际列表。这将使我们有能力知道何时抛出错误!
结果:
/*
This method will add "data" to your "list".
If data doesn't have a value (null), than it will add the default value.
Will return:
- true:
when the value has been added to the list.
- false:
when there was an error.
*/
public static <T> boolean saveAdd(List<T> list, T data, Class<T> c) {
try {
// If the data is a String but does not contain a value:
if(c.equals(String.class) && (data == null || data.equals(""))){
list.add((T)"-");
return true;
}
if(data == null){
// Default predefined values:
if(c.equals(Double.class)){
list.add((T)new Double(0.00));
return true;
}
if(c.equals(Long.class)){
list.add((T)new Long(0));
return true;
}
if(c.equals(Integer.class)){
list.add((T)new Integer(0));
return true;
}
// Generic method of creating the default value:
list.add(c.newInstance());
return true;
}
// Data does contain a value, so we don't have to create one:
list.add(data);
return true;
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
// Didn't work...
return false;
}
用法示例:
List<String> test = new ArrayList<>();
if(!ArrayUtil.saveAdd(test, null, String.class)){
System.out.println("An error has been thrown!");
}