2013-08-14 14 views
18

Ich erkläre diese Klasse, die nicht sinnvoll ist.Array-Deklaration Trick: Ist es schlecht, es zu benutzen?

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; 
    } 

} 

, die mir erlaubt, (wenn ich eine statische Import in meinem Code haben) zu Arrays deklarieren wie folgt aus:

int[][] arr = arr(
    arr(1, 2, 1), 
    arr(2, 1, 3), 
    arr(3, 3, 3)); 

persönlich finde ich es sinnvoll, und die wenigen Menschen, die ich mit ihm verstehen zu arbeiten.

Es kommt von der Tatsache, dass ich von Java-Array-Deklaration nach der Arbeit in Python frustriert wurde, und ich arbeite irgendwann mit Tastaturen, wo die geschweiften Klammern schwer zu finden sind (italienischer Standard auf meinem alten Laptop).

Was ich wissen will ist: Gibt es etwas Schlechtes daran, so zu arbeiten? Ist es deiner Meinung nach gut genug? Wie kommt es, dass dieser Trick nicht berühmt ist? Ist

+15

Seien Sie vorsichtig nicht Ihre eigene Programmiersprache auf Java zu schreiben, die vorhandene Funktionalität neu erstellt; nur schlechte Dinge liegen auf dieser Straße. –

+1

Verwenden Sie einfach keine Arrays, sondern List und Arrays.asList –

+5

bereiten Sie sich auf Talk Like a Pirate Day vor? :) – Roald

Antwort

4

das notwendig ?, was ist:

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

Es ist lesbar genug, aber es ist nicht bekannt oder häufig verwendet, weil es ist so viel einfacher zu erklären und initialisieren auf der gleichen Linie mit:

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

nicht viel anders aus

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

Außerdem glaube ich nicht, dass Sie vor geschweiften Klammern in Java davonlaufen können :)

+1

Sie haben Recht, aber Sie können dies nicht als Methodenparameter verwenden. – jlordo

+29

yourMethod (neu int [] [] {{ 1, 2, 1}, {2, 1, 3}, {3, 3, 3}}); funktioniert – rocketboy

+0

ja, du hast Recht ... – jlordo

8

Der Trick ist nicht berühmt, weil Sie es wirklich nicht mit der geschweiften Klammernnotation brauchen. Ist es wirklich eine Hilfe, diese geschweiften Klammern zu vermeiden? In C-verwandten Sprachen denke ich, dass man sie nicht vermeiden kann.

Feldinitialisierungsliste:

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

Ihre Version ist lesbar genug, aber da ich die Sprache unterstützt dies wissen, würde ich frage mich, ob die Funktion mehr alles tun würde.

+8

'Java! = C#' ... – jlordo

+1

@jlordo Aww verdammt, es tut mir so leid. Hätte mehr Aufmerksamkeit schenken sollen. __Fixed! __ –

1

Die einzige Zeit, die ich verwendete ArrayTrick Typ Deklarationen ist, wenn ich Varargs in einer Situation, in der Varargs nicht in einem Methodenaufruf deklariert werden können, verwenden möchten. In der Regel wird hier ein Handler verwendet.

Beispiel, mit einem Beispiel, das ich mit dem täglichen Umgang und die Verwendung meiner Bibliothek, die ich geschrieben habe, SQLExecutor, Folgendes zu beachten:

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(); 
    } 
} 

Die IterativeResultSetHandler ist eine Prozedur, die nach einer Ausführung der Abfrage aufgerufen wird.

Jetzt wollte ich so viele Attribute wie möglich übergeben, und da Varargs nur das letzte Argument in einem Methodenaufruf sein kann, erstellte ich VarargsUtils, um genau wie Ihre ArrayTricks Klasse zu tun.

+0

Soweit ich das anhand des Beispielcodes erkennen kann (ohne SQLQueryExecutor verwendet zu haben), können Sie genau das gleiche eingebaute Java verwenden, wie die anderen Antworten vorschlagen: 'Object stuff [] = {1294," EFT "}; System.out.println (stuff [0]); System.out.println (stuff [1]); '- Es gibt korrekt aus '1294 \ NEFT \ n' – Izkata

+0

Ich könnte, aber es erleichtert die Lesbarkeit mit varargs Argumente, imho. –

0

Es ist gut, sollte es in der Standardbibliothek sein. Sie sollten jedoch "Array" in voller Länge buchstabieren.

Ich sehe drei Anwendungsfälle für sie

//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 
+2

Ihre erste kann bereits 'for (String s: asList (" a "," b "," c "))' geschrieben werden, wenn Sie 'java.util.Arrays.asList' importieren. – ruakh

+0

sicher, aber ich bevorzuge das nicht. – ZhongYu

Verwandte Themen