我宣布这个课程没有用。
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数组声明感到沮丧,而且我有时会使用键盘很难找到大括号(我的旧笔记本电脑上的意大利标准)。
我想知道的是:那样的工作有什么不好吗?你认为它足够可读吗?为什么这个把戏不出名?
答案 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