18

我正在声明这个类,它没有用。

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 数组声明感到沮丧,有时我会使用难以找到大括号的键盘(我的旧笔记本电脑上的意大利标准)。

我想知道的是:这样工作有什么不好的吗?你认为它的可读性够吗?这招怎么不出名?

4

6 回答 6

45

和没太大区别

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

另外,我不认为你可以在java中逃避大括号:)

于 2013-08-14T15:03:43.067 回答
19

它具有足够的可读性,但它并不出名或经常使用,因为使用以下命令在同一行上声明和初始化要容易得多

int[][] arr = {
        {1,2,1},
        {2,1,3},
        {3,3,3}};
于 2013-08-14T15:03:33.747 回答
8

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

数组初始化:

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

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

于 2013-08-14T15:08:54.847 回答
4

有必要吗,那怎么办:

    String[][] arr = {{"2","3","4"},
                     {"3","4","5"},
                     {"4","5","6"}};
于 2013-08-14T15:03:05.620 回答
1

我使用ArrayTrick类型声明的唯一一次是当我想在方法调用中无法声明可变参数的情况下使用可变参数时。这通常是使用处理程序的地方。

示例,使用我每天处理的示例,并使用我编写的库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类一样。

于 2013-08-14T15:27:20.570 回答
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
于 2013-08-14T15:36:29.173 回答