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

8

中かっこ表記では本当に必要ないため、このトリックは有名ではありません。それらの中括弧を避けることは本当に助けになりますか? C系言語では避けて通れないと思います。

配列の初期化:

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

あなたのバージョンは十分に読みやすいですが、言語がこれをサポートしていることを知っているので、関数がそれ以上のことをするのではないかと思います.

于 2013-08-14T15:08:54.847 に答える
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

于 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 に答える