如何重新编码这个Java Code Snippet?

时间:2016-10-27 14:47:19

标签: java code-snippets

我做了我的评论代码工作,不知何故,当看到来自我的同事的这个片段时我感到非常不舒服:

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, 但似乎没有正确的方法来重新编码这个片段,

2 个答案:

答案 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!");
}