Подтвердить что ты не робот

Трудность объявления массива: плохо ли использовать его?

Я объявляю этот класс, это не полезно.

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, и я когда-нибудь работал с клавиатурами, где трудно найти фигурные скобки (итальянский стандарт на моем старом ноутбуке).

Что я хочу знать: есть ли что-то плохое в работе? На ваш взгляд, это достаточно читаемо? Почему этот трюк не знаменит?

4b9b3361

Ответ 1

Не сильно отличается от

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

Кроме того, я не думаю, что вы можете убежать от фигурных скобок в java:)

Ответ 2

Это достаточно читаемо, но он не известен или используется часто, потому что он гораздо проще объявить и инициализировать в той же строке, используя:

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

Ответ 3

Трюк не знаменит, потому что вам действительно не нужно его с фигурной скобкой. Действительно ли это помогает избежать этих фигурных скобок? На языках, связанных с C, я думаю, что их не избежать.

Инициализация массива:

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

Ваша версия достаточно читаема, но поскольку я знаю, что язык поддерживает это, я бы задался вопросом, будет ли функция делать что-нибудь еще.

Ответ 4

Это необходимо?, а как насчет:

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

Ответ 5

Единственный раз, когда я использовал объявления типа 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.

Ответ 6

Хорошо, это должно быть в стандартной библиотеке. Вы, вероятно, должны подробно описать "массив", хотя.

Я вижу 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