数组声明技巧:使用它不好吗?

时间:2013-08-14 15:00:24

标签: java

我宣布这个课程没有用。

public class ArrayTrick {

    public static char[] arr(char... arr) {
        return arr;
    }

    public static float[] arr(float... arr) {
        return arr;
    }

    public static double[] arr(double... arr) {
        return arr;
    }

    public static long[] arr(long... arr) {
        return arr;
    }

    public static int[] arr(int... arr) {
        return arr;
    }

    public static short[] arr(short... arr) {
        return arr;
    }

    public static byte[] arr(byte... arr) {
        return arr;
    }

    public static boolean[] arr(boolean... arr) {
        return arr;
    }

    public static <T> T[] arr(T... arr) {
        return arr;
    }

}

允许我(一旦我的代码中有静态导入)声明这样的数组:

int[][] arr = arr(
   arr(1, 2, 1),
   arr(2, 1, 3),
   arr(3, 3, 3));

我个人觉得它很有用,而且与我合作的人很少了解它。

这是因为在使用python之后我对java数组声明感到沮丧,而且我有时会使用键盘很难找到大括号(我的旧笔记本电脑上的意大利标准)。

我想知道的是:那样的工作有什么不好吗?你认为它足够可读吗?为什么这个把戏不出名?

6 个答案:

答案 0 :(得分:45)

没什么不同
int[][] arr = {{1, 2, 1},
               {2, 1, 3},
               {3, 3, 3}};

另外,我认为你不能逃避java中的花括号:)

答案 1 :(得分:19)

它足够可读,但它并不常见或经常使用,因为它使用在同一行声明和初始化更加容易:

int[][] arr = {
        {1,2,1},
        {2,1,3},
        {3,3,3}};

答案 2 :(得分:8)

这个技巧并不出名,因为你真的不需要用花括号表示法。避免那些大括号真的有帮助吗?在与C相关的语言中,我认为没有避免它们。

数组初始化:

int[][] arr = {
    {1, 2, 1},
    {2, 1, 3},
    {3, 3, 3}
};

你的版本足够可读,但由于我知道该语言支持这一点,我想知道该函数是否会做更多的事情。

答案 3 :(得分:4)

这是必要的吗?,那么:

    String[][] arr = {{"2","3","4"},
                     {"3","4","5"},
                     {"4","5","6"}};

答案 4 :(得分:1)

我唯一使用ArrayTrick类型声明的时候是在我不希望在方法调用中声明varargs的情况下使用varargs的时候。这通常是使用处理程序的地方。

示例,使用我每天处理的示例,并使用我编写的库SQLExecutor,请考虑以下内容:

final String SQL_QUERY = "Select* from transaction where TRANSACTION_ID = ? AND TRANSACTION_TYPE >= ?";
final String DATABASE_CONNECTION_STRING = "";
final String USER_NAME = "";
final String PASSWORD = "";

Connection connection = null;
try {
    connection = DriverManager.getConnection(DATABASE_CONNECTION_STRING, USER_NAME, PASSWORD);
    SQLQueryExecutor executor = new BasicSQLQueryExecutor();
    executor.setConnection(connection); //ALWAYS pass a Connection.
    executor.setCloseConnection(false);

    Transaction transaction = executor.executeQuery(SQL, VarargsUtils.toArray(1294, "EFT"), new IterativeResultSetHandler<BigDecimal[]>() {

        /* (non-Javadoc)
        * @see za.co.sindi.sql.IterativeResultSetHandler#handle(za.co.sindi.sql.ResultSetIterator)
        */
        @Override
        public BigDecimal[] handle(ResultSetIterator iterator) throws SQLException {
        // TODO Auto-generated method stub
            Transaction transaction = new Transaction();
            while (iterator.hasNext()) {
                Map<Object, Object> attributes = iterator.next();
                transaction.setTransactionId(attributes.get("TRANSACTION_ID"));
                transaction.setTransactionType(attributes.get("TRANSACTION_TYPE"));
            }

            return transaction;
        }
    });
} catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (DatabaseExecutionException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} finally {
    try {
        SQLUtils.close(connection);
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

IterativeResultSetHandler是在执行查询后调用的处理程序。

现在,我想传递尽可能多的属性,因为varargs只能是方法调用中的最后一个参数,所以我创建VarargsUtils就像你的ArrayTricks类一样。

答案 5 :(得分:0)

这很好,它应该在标准库中。你可能应该完全拼出“数组”。

我看到了3个用例

//1
  for(String s : array("a", "b", "c")) ...

//2
  someMethod( array(1,2), array("a", "b") );

//3
  List<String> list1 = ..., list2 = ...;
  List<String>[] lists = array( list1, list2 );
  // generic array creation and initialization