Ответ 1
Не сильно отличается от
int[][] arr = {{1, 2, 1},
{2, 1, 3},
{3, 3, 3}};
Кроме того, я не думаю, что вы можете убежать от фигурных скобок в 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));
лично я считаю это полезным, и немногие люди, с которыми я работаю, понимают это.
Это происходит из-за того, что я разочаровался в объявлении массива java после работы на python, и я когда-нибудь работал с клавиатурами, где трудно найти фигурные скобки (итальянский стандарт на моем старом ноутбуке).
Что я хочу знать: есть ли что-то плохое в работе? На ваш взгляд, это достаточно читаемо? Почему этот трюк не знаменит?
Не сильно отличается от
int[][] arr = {{1, 2, 1},
{2, 1, 3},
{3, 3, 3}};
Кроме того, я не думаю, что вы можете убежать от фигурных скобок в java:)
Это достаточно читаемо, но он не известен или используется часто, потому что он гораздо проще объявить и инициализировать в той же строке, используя:
int[][] arr = {
{1,2,1},
{2,1,3},
{3,3,3}};
Трюк не знаменит, потому что вам действительно не нужно его с фигурной скобкой. Действительно ли это помогает избежать этих фигурных скобок? На языках, связанных с C, я думаю, что их не избежать.
Инициализация массива:
int[][] arr = {
{1, 2, 1},
{2, 1, 3},
{3, 3, 3}
};
Ваша версия достаточно читаема, но поскольку я знаю, что язык поддерживает это, я бы задался вопросом, будет ли функция делать что-нибудь еще.
Это необходимо?, а как насчет:
String[][] arr = {{"2","3","4"},
{"3","4","5"},
{"4","5","6"}};
Единственный раз, когда я использовал объявления типа 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
.
Хорошо, это должно быть в стандартной библиотеке. Вы, вероятно, должны подробно описать "массив", хотя.
Я вижу 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