为了账号安全,请及时绑定邮箱和手机立即绑定

如何以清晰易读的方式根据参数创建数组?

如何以清晰易读的方式根据参数创建数组?

守着一只汪 2023-08-09 14:55:48
这是我的问题:我想以非常清晰易读的方式创建一个数组,以便读者能够立即知道数组的元素。当数组固定后,就很容易也很清楚了:    String[] columns = new String[] { "unit", "file_row", "unit_row", "content" };    String[] types = new String[] { "INTEGER", "INTEGER", "INTEGER", "TEXT" };但我也有变量数组,具体取决于参数:    // Is an argument of my method, containing the variable elements of the future array    String[] method_arg = new String[] {"key1", "key2"};    // The clear and readable way doesn't work anymore    String[] columns = new String[] { "unit", method_arg, "hash"};    String[] types = new String[] { "INTEGER", method_arg_types, "INTEGER"};    // And the ways that work are ... much less readable    String[] columns = new String[] {"unit"};    columns = Stream.concat(Arrays.stream(columns), Arrays.stream(method_arg)).toArray(String[]::new);    columns = Stream.concat(Arrays.stream(columns), Arrays.stream(new String[] {"hash"})).toArray(String[]::new);    // Awkward    String[] types = new String[method_arg.length + 2];    Arrays.fill(types, "TEXT");    types[0] = "INTEGER";如何使代码保持清晰易读?代码相当灵活,使用列表应该不是问题,但我宁愿避免使用非标准库。另外,我知道一个解决方案是创建一个方法来创建这些数组,例如    join_arrays(new String[] {"unit"}, method_arg, new String[] {"hash"});但如果有解决方案使代码清晰并避免创建专用函数,那就更好了。如果没有,我将求助于这个选项。感谢您有一个愉快的一天 !
查看完整描述

3 回答

?
森栏

TA贡献1810条经验 获得超5个赞

我通常最终会使用自定义方法来解决此类问题:

private <T> T[] makeArray(T... elements) {
    return elements;
}

你的例子看起来像:

String[] columns = makeArray("unit", method_arg, "hash");
String[] types = makeArray("INTEGER", method_arg_types, "INTEGER");


查看完整回答
反对 回复 2023-08-09
?
心有法竹

TA贡献1866条经验 获得超5个赞

我认为您误解了代码的清晰度和可读性。首先,您完全正确,代码的清晰度和可读性具有最高价值。但是,这并不意味着读者应该立即看到代码的结果 - 在您的情况下是数组的内容。这意味着读者首先可以清楚地看到代码的作用,其次可以清楚地看到代码是如何做的。有很多方法可以确保清晰度。

  • 将较长的方法分解为较短的方法,最好是 4 - 5 行,但最多不超过 10 - 15 行。确保每个方法仅处理一个逻辑上不可分割的问题。

  • 确保方法名称具有信息性

  • 参数数量保持最少 (0 - 3)

  • 参数的名称和顺序是有意义的。

  • 返回值与方法的目的相匹配。

当然,这不是完整的列表。


查看完整回答
反对 回复 2023-08-09
?
梵蒂冈之花

TA贡献1900条经验 获得超5个赞

Java 有一个更简单的方法,恕我直言,这更容易一点,并且可以被编译掉:-)


示例用法,类似于其他建议:


private static void method(String method_arg, String method_arg_types) {

    String[] columns = array("INTEGER", method_arg, "INTEGER");

    String[] types = array("INTEGER", method_arg_types, "INTEGER");

}

作为 var-args 实现方式的副作用,实现要容易得多。


@SafeVarargs

public static <T> T[] array(T... values) {

    return values;

}

它也在org.assertj.core.util中实现,恕我直言,它应该是 JDK 的一部分:-)



查看完整回答
反对 回复 2023-08-09
  • 3 回答
  • 0 关注
  • 163 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信