Frage

Von den verschiedenen Online-Artikel auf Java 7 Ich bin gekommen, zu wissen, dass Java 7 wird Sammlung Literale mit 1 wie folgt aus:

List<String> fruits = [ "Apple", "Mango", "Guava" ];
Set<String> flowers = { "Rose", "Daisy", "Chrysanthemum" };
Map<Integer, String> hindiNums = { 1 : "Ek", 2 : "Do", 3 : "Teen" }; 

Meine Fragen sind:

  1. Wäre es nicht möglich gewesen, eine statische Methode of in allen der Sammlung Klassen bereitzustellen, die verwendet werden könnten, wie folgt:

List<String> fruits = ArrayList.of("Apple", "Mango", "Guava");

IMO Das sieht so gut wie die wörtliche Version und ist auch recht präzise. Warum dann mußten sie eine neue Syntax zu erfinden ( EDIT:. Mit dem 'neuen' ich meine 'neuer Java')?

  1. Wenn ich List<String> fruits = [ "Apple", "Mango", "Guava" ]; sagen, was List würde ich eigentlich? Wäre es ArrayList oder LinkedList oder etwas anderes?
  2. sein

1 Wie bereits erwähnt in den Kommentaren, Sammlung Literale tat nicht den Cut für Java 7, noch in der Tat Java 8. (Hier ist ein E-Mail von Brian Goetz, einem Oracle-Entwickler, eine Zusammenfassung der Gründe für die nicht mit diese Funktion,. und hier ist der Vorschlag selbst)

War es hilfreich?

Lösung

Antwort auf Frage 2:

final List<Integer> piDigits = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 9];

gibt Ihnen eine unveränderlich Liste.

Die ganze Idee dieses Vorschlags, dass der Subtyp nicht angegeben werden. Der Compiler wählt eine geeignete Implementierung abhängig von der Sammlung auf der rechten Seite.

Lesen Sie die Details hier: Vorschlag: Sammlung Literale

Antwort auf Frage 1: Ja würde es haben. Es ist eine Frage des Stils.

Andere Tipps

Eine andere Sache zu beachten ist, dass für Listen dies sehr einfach ist var args verwenden, haben aber ein wenig darüber nachdenken, wie Sie es für eine Karte tun würde. Es gibt keine Möglichkeit Paare Argumente zu einer var args Methode zu liefern, es sei denn, Sie ein zusätzliches Map.Entry Objekt oder etwas ähnliches einführen.

So bestehende Syntax Sie mit

würden am Ende
Map<String,String> map = HashMap.of( new Entry( "key1", "value1" ), 
                                     new Entry( "key2", "value2" ) );

, die sehr erhalten würden sehr schnell ermüdend.

Auch wenn Sie gehen auf dem Weg ein Erbauer der Verwendung (wie wir), dann ist es ziemlich hässlich

Map<String,String> map = CollectionUtil.<String,String>map()
                                        .put( "key1", "value1" )
                                        .put( "key2", "value2" )
                                        .map();

Nicht oben erwähnt ist die Einfachheit der Sammlung von Sammlungen. Nehmen wir an Sie eine Konstante, die Währungsnamen und Werte verschiedener Länder gespeichert werden sollen.

// Currency devisions by country, and their various names
Map<String,Map<Float,List<String>>> CURRENCIES =
    { "US" : { 1 : ["dollar","buck"],
               0.25 : ["quarter"],
               0.10 : ["dime"],
               0.05 : ["nickel"],
               0.01 : ["penny"] },
      "UK" : { 1 : ["pound"],
               1.05 ["guinea"],
               0.125 : ["half crown"],
               0.05 : ["shilling","bob"],
               0.025 : ["sixpence"] } 
    };

habe ich in zwölf sehr gut ablesbaren Linien eine enorme Menge an Daten packen. Hätte ich ArrayList.of (zehnmal) und eine ähnliche Karte Konstruktor verwendet (viermal, mit zehn Map.EntryPair!), Haben die Funktionsaufrufe den Code aufgebläht würde und machte es schwieriger, deutlich zu lesen.

Während es auf jeden Fall im Bereich des syntaktischen Zuckers ist, ist dies die # 1-Funktion freue ich mich in Java 7 (wenn es überhaupt steigt aus).

A1 Ja, es ist möglich, erfordert aber Sie mehr und mehr zu geben.

Dies ist zwar etwas nicht sicher ist im Wesentlichen falsch, ist es eines der Dinge Entwickler beklagen mehr über. Sie (und manchmal mache ich mir selbst) das Gefühl, dass Java ist zu ausführlich .

Da die Hardware schneller geworden, neue Programmiersprachen, die am Anfang zu teuer waren Berechnungen durchzuführen wurde möglich, und sie werden nun verwendet, um mehr und mehr und sind sehr beliebt. Wenn Entwickler in Java schreiben haben wieder das Gefühl haben, wie oh nein: , public static void main wieder Art!.

Eines der Dinge, dass Java (und statisch Arten Sprachen im Allgemeinen) hatten, ist die Ausführungsgeschwindigkeit zu erhöhen, wie viele Validierungen wie möglich auszuführen vor läuft (das heißt, in der Zusammenstellung der Bühne)

Diese neuen Programmiersprachen (bemerkenswert Python und Ruby) machen eine Freude Programm, weil Sie weniger geben müssen, um das gleiche zu erreichen.

Die Reaktion Java wird auf diese Einnahme, ist die Sprache, größer zu machen und einen Teil dieser „syntaktischer Zucker“ in die Sprache übernehmen, das ist der Grund.

Auch Programmiersprachen wie C # hatte diese erweiterten Funktionen (Eigenschaften kommt meiner Meinung nach) weniger die Entwickler Code zu machen.

Am Ende denke ich, dass diese Zusätze die Sprache profitieren, aber sie haben sehr sorgfältig hinzugefügt werden, zu vermeiden, dass die Kompatibilität brechen und / oder eine Sprache erstellen, die so groß ist, dass niemand sie verwenden kann.

Ich denke, eine Alternative wäre gewesen ist die Methoden zu erlauben, in ihrem Namen zu sein ausdrucksvoll, aber das ist sehr kompliziert, für Java. Vielleicht in einer neuen Sprache :).

Die Karte setzen Methodensignatur so gewesen sein könnte:

 /**
  * Analog to put( Object k, Object v );
  */
 public [( Object = k )]=( Object  v ) {
 } 

Das ist damit der Methodenname sein: [(key)]=(value) und läßt schließlich die Klammer (wie in Ruby oder ursprünglich in Smalltalk) so dass diese Methode wäre:

 Map map = ....
 map.["name"]="Oscar";

Da das nicht möglich ist (weil []= ist nicht gültige Methode Identifikatoren) und Schreiben:

 map.put("name","Oscar");

Is ... mmhh zu ausführlich, beschlossen sie, diese Lösung hinzuzufügen.

Eine weitere Verbesserung sind Zahlenliterale, so können Sie eingeben:

 int million = 1_000_000;

A2 . Sie werden noch etwas anderes bekommen

A3 (Erweiterung meines Kommentars auf kloffy Antwort ).

Sie könnten das gleiche Code in Java wie heute schreiben.

Zugegeben Stage, Scente, Group, Text, ImageView, Image wurden bestehende Java-Klassen, könnten Sie Folgendes eingeben:

 new Stage() {{
     title  =  "Group-Nodes-Transformation";
     scene  =  new Scene() {{
         width =  600;
         height = 600;
         content = new Group() {{
             content = new Object[] =  {
                 new Circle() {{
                     centerX = 300;
                     centerY = 300;
                     radius = 250;
                     fill = Color.WHITE;
                     stroke = Color.BLACK;
                 }},
                 new Text() {{
                     x = 300;
                     y = 300;
                     content = "Mr. Duke";
                 }},
                 new ImageView() {{
                     image = new  Image() {{
                         url = "D:\\TEST\\Documents\\duke.png"
                         width = 50;
                         height = 50;
                     }};
                 }};
             };
         }};
     }};
 }};

Sie könnten durch die deklarative Programmierung Stil inspiriert wurden von JavaFX . Wenn das der Fall ist jedoch, ich bin enttäuscht, dass sie nicht den ganzen Weg zu Unterstützung Objektliterale als gut gehen. Hier ist ein Beispiel von Objektliterale in JavaFX:

Stage {
    title: "Group-Nodes-Transformation"
    scene: Scene {
        width: 600
        height: 600
        content: Group {
            content: [
                Circle {
                    centerX: 300
                    centerY: 300
                    radius: 250
                    fill: Color.WHITE
                    stroke: Color.BLACK
                },
                Text {
                    x: 300
                    y: 300
                    content: "Mr. Duke"
                },
                ImageView {
                    image: Image {
                        url: "D:\\TEST\\Documents\\duke.png"
                        width:50
                        height:50
                    }
                }
            ]
        }
    }
}

Ich denke, dass diese Art sicher zu programmieren, selbst auf bestimmte Anwendungsbereiche eignet. Am Ende ist es immer eine Frage des Geschmacks ...

Sprache Design ist eine Frage des Geschmacks. Having said that, diese Art von Liste / Objektinitialisierung ist sehr populär geworden. Zum Beispiel hat C # fast das gleiche. Die Syntax ist sehr flexibel und, wie auch Ihre Beispiele zeigen, können Sie so etwas wie ein Wörterbuch inline initialisieren. Ich eher wie die Syntax wählten die Designer hier.

IMO ist dies nur ein syntaktischer Zucker dass Vereinfacht Code ein bisschen. Warum sind Sie nicht von einem Zucker der gleichen Art überrascht:

int []arr1 = new int[] {1,2,3};
int []arr2 = {1,2,3};

Es ist nur eine bequeme Möglichkeit, eine einfache Idee, anstatt etwas zu schreiben, wie

auszudrücken
int []arr = new int[3];
arr[0] = 1;
arr[1] = 2;
arr[2] = 3;

Ist dieses Add etwas wirklich Neues in unser Leben? Nun, nein. Ist es unser Leben ein bisschen leichter macht? Ich denke, ja.

In Bezug zweiten Teils der ersten Frage, ich weiß nicht, was tatsächliche Typen sein würden. Aber ehrlich gesagt, wie oft ist es egal, was Sammlung Implementierung ist? Vor allem unter Berücksichtigung, dass solche Sammlungen werden voraussichtlich relativ gering sein (mit allen Werten von einem Entwickler eingegeben). Wie auch immer, in den seltenen Fällen, wenn Sie die Pflege tun, nur nicht diese vereinfachte Syntax verwenden, und den Job selbst tun.

Es ist nicht ganz neue Syntax als solche Literale vorhanden ist in Python, Javascript (json) und wahrscheinlich auch anderen Sprachen.

Ich habe keine Informationen über Java 7 noch nicht gesehen offen zu sein (wurden auf C ++ konzentriert und Javascript in letzter Zeit), aber es ist wirklich gut, eine solche neben der Sprache zu sehen.

Nur einen Punkt zu klären -. Sie nicht „neue Syntax erfinden“

Ich bin sicher nicht 100%, wo die ursprüngliche Idee kam, aber mit „[]“ Listen bezeichnen und „{}“ zu bezeichnen Karten gibt es in Perl (wo diejenigen verwendet werden, in den Gebäude Array Refs und Hash-Refs) .

Es gibt kein „set“ in Perl streng genommen aber die meisten idiomatische Implementierung eines Satzes ist eine Karte (Kartenset Mitglied auf 1), so „{}“ auch paßt.

So Perl würde sagen, genau die gleichen Dinge wie Sie aufgelistet wie:

$fruits = [ "Apple", "Mango", "Guava" ]; # Creates array reference
$flowers = { "Rose" => 1, "Daisy" => 1, "Chrysanthemum" => 1 };
     # or { map {$_=>1} ("Rose", "Daisy", "Chrysanthemum"))
$hindiNums = { 1 => "Ek", 2 => "Do", 3 => "Teen" }; 

Ich sage nicht, das oben von Perl kommt, natürlich, aber es ist mit mindestens einer anderen Sprache konsistent und damit möglicherweise mit einer breiteren Anwendung.

Sie sind gerade dies ist nur leer syntaktischer Zucker.

Auch Ihre ArrayList.of(...) würden nur kurze Hand für new ArrayList<...>(Arrays.asList(...)) sein

Ich glaube, einer der Gründe ist, dass of( ... ) generiert eine nicht markiert Warnung, wenn Sie es mit Instanzen der generischen Objekten zu füllen versuchen würde.

Der Grund, ... Expandiert zu einem Java-Array und Java-Arrays nicht wie generische Instanzen.

Hier ist ein Beispiel aus der Spezifikation, dass sich mit diesem speziellen Thema:

List<List<Integer>> pascalsTriangle =
    [[1],
     [1, 1],
     [1, 2, 1],
     [1, 3, 3, 1],
     [1, 4, 6, 4, 1]]

Es gibt derzeit keine Möglichkeit, diese Variable in dieser prägnanten Weise zu initialisieren und ohne nicht markiert Warnung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top