Вопрос

Из различных онлайн-статей о Java 7 я узнал, что Java 7 будет иметь литералы коллекции1 например, следующее:

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

Мои вопросы таковы:

  1. Разве не было бы возможно предоставить статический метод of во всех классах коллекции, которые могут быть использованы следующим образом:

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

IMO это выглядит так же хорошо, как и буквальная версия, и также достаточно лаконично.Зачем же тогда им понадобилось изобретать новый синтаксис (Редактировать: Под "новым" я подразумеваю "новичка в Java".)?

  1. Когда я говорю List<String> fruits = [ "Apple", "Mango", "Guava" ]; что List получу ли я на самом деле?Было бы это ArrayList или LinkedList или что-то еще?

1 Как отмечалось в комментариях, литералы коллекции сделали нет сделайте разрез для Java 7, да и вообще для Java 8.(Вот пример Адрес электронной почты от Брайана Гетца, разработчика Oracle, кратко излагающего причины отказа от включения этой функции;и вот этот самый предложение сама по себе.)

Это было полезно?

Решение

Ответ на вопрос 2:

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

дает тебе неизменный список.

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

Прочитайте детали здесь: Предложение: Сбор литералов

Ответ на вопрос 1: Да, это бы. Это вопрос стиля.

Другие советы

Другое, что следует отметить, что для списков это очень легко, используя var args, но немного подумать о том, как вы сделаете это для карты. Нет способа поставлять пары аргументов в метод var args, если вы не введуете дополнительный объект map.centry или что-то подобное.

Так что используя существующий синтаксис, который вы получите

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

который бы очень быстро утомлял очень быстро.

Даже если вы пойдете по пути использования шаблона построителя (как мы делаем), то это довольно безобразно

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

Не упомянутое выше - простота коллекций коллекций. Позвольте сказать, что вы хотите постоянно хранить названия валюты и ценности разных стран.

// 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"] } 
    };

У меня есть огромное количество данных в двенадцать чрезвычайно разборчивых линий. Я использовал ArrayList.of (Десять раз) и какая-то подобная конструктор карты (четыре раза, с десятью map.entrypair!), Функциональные вызовы раздували бы код и сделали его значительно сложнее для чтения.

Хотя это определенно в области синтаксического сахара, это функция № 1, я с нетерпением жду в Java 7 (если она когда-либо выйдет).

A1 Да, это возможно, но требует, чтобы вы печатали все больше и больше.

Хотя это, конечно, не является чем-то принципиально неправильным, это одна из тех вещей, на которые разработчики жалуются больше всего.Они ( а иногда и я сам ) чувствуют , что Java это слишком многословно.

По мере ускорения аппаратного обеспечения стали возможными новые языки программирования, которые поначалу были слишком дорогими для выполнения вычислений, а сейчас они используются все чаще и пользуются большой популярностью.Когда разработчикам снова приходится вводить текст на Java, они чувствуют, что о , нет:, public static void main снова! вроде того.

Одна из причин, по которой Java ( и языки статических типов в целом ) должна была увеличить скорость выполнения , - это выполнение как можно большего количества проверок до того, как выполняется (то есть находится на стадии компиляции)

На этих новых языках программирования (особенно на Python и Ruby ) приятно программировать, потому что для достижения того же результата вам приходится печатать меньше.

Реакция Java на это заключается в том, чтобы сделать язык больше и включить часть этого "синтаксического сахара" в язык, вот почему.

Даже такие языки программирования, как C #, имели эти расширенные функции (мне приходят на ум свойства), чтобы уменьшить объем кода разработчика.

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

Я думаю, альтернативой было бы позволить методам быть более выразительными в их именах, но для Java это очень сложно.Возможно, на новом языке :).

Сигнатура метода Map put могла бы быть такой:

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

Это позволяет имени метода быть: [(key)]=(value) и в конечном итоге опустите скобку ( как в Ruby или изначально в Smalltalk), чтобы этот метод был:

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

Поскольку это невозможно ( потому что []= недопустимые идентификаторы методов ) и запись:

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

Есть ...mmhh слишком многословно, они решили добавить это решение.

Еще одним улучшением являются числовые литералы, так что вы сможете вводить:

 int million = 1_000_000;

A2 :Вы получите что-то еще.

A3 ( расширяя мой комментарий по клоффи ответ ).

Вы могли бы написать тот же код на Java, что и сегодня.

Предоставлено Stage, Scente, Group, Text, ImageView, Image если бы существовали классы Java, вы могли бы ввести:

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

Они могли бы быть вдохновлены декларативным стилем программирования Javafx.. Отказ Если это так, то есть, я разочарован тем, что они не проходили весь путь к поддержке объектных литералов. Вот пример объектных литералов в 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
                    }
                }
            ]
        }
    }
}

Я думаю, что этот стиль программирования, безусловно, поддается определенным областям применения. В конце концов это всегда вопрос вкуса ...

Языковая конструкция - вопрос вкуса. Сказав это, этот вид инициализации списка / объекта стал очень популярным. Например, C # имеет почти то же самое. Синтаксис довольно гибкий, и, поскольку даже ваши примеры показывают, позволяет инициализировать что-то вроде встроенного словаря. Я скорее, как синтаксис дизайнеры выбрали здесь.

ИМО это просто Синтаксический сахар что упрощает код немного. Почему вы не удивляетесь сахаром того же вида:

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

Это просто удобный способ выразить простую идею вместо того, чтобы писать что-то вроде

int []arr = new int[3];
arr[0] = 1;
arr[1] = 2;
arr[2] = 3;

Это делает что-то действительно новое в нашу жизнь? Ну нет. Это делает нашу жизнь немного проще? Я думаю да.

Что касается второй части вопроса, я не знаю, какие фактические типы будут. Но откровенно говоря, как часто вы заботитесь о том, что такое сборная реализация? Особенно учитывая, что такие коллекции должны быть относительно маленькими (со всеми значениями, набранными разработчиком). В любом случае, в тех редких случаях, когда вы заботитесь, просто не используйте этот упрощенный синтаксис и сделайте работу самостоятельно.

Это не совсем новый синтаксис, так как такие литералы присутствуют в Python, JavaScript (JSON) и, вероятно, другие языки.

Я еще не видел никакой информации о Java 7, чтобы быть Фрэнком (были сосредоточены на C ++ и JavaScript в последнее время), но на самом деле приятно видеть такое дополнение к языку.

Просто чтобы уточнить один момент - они не "изобрели новый синтаксис".

Я не на 100% уверен, что исчезло исходная идея, но с использованием «[]» для обозначения списков и «{}» для обозначения карт существует в Perl (где используются в массиве здания Ref и Hash Refs).

Там нет «набора» в Perl строго говоря, но самая идиоматическая реализация набора - это карта (MAP-набор участника на 1), поэтому «{}» также подходит.

Таким образом, Perl скажет точно так же, как вы перечислены как:

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

Я не говорю выше, пришел от Perl, конечно, но он соответствует хотя бы одному другому языку и, таким образом, с более широким использованием.

Вы правы, это просто пустой синтаксический сахар.

Также твой ArrayList.of(...) будет просто короткаю new ArrayList<...>(Arrays.asList(...))

Я думаю, что одна из причин, что of( ... ) будет генерировать А.Н. не отмечающуюся Предупреждение Если вы попытаетесь заполнить его экземплярами общих объектов.

Причина, ... Расширяется до массива Java, а массивы Java не любят универсальные экземпляры.

Вот пример спецификации, который касается этой конкретной проблемы:

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top