Неравномерность синтаксиса в Java - PullRequest
9 голосов
/ 29 июля 2011

Итак, я просматривал некоторые из новых функций Java 7, включая try-with-resources bit.

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

try 
    (InputStream fis = new FileInputStream(source);
        OutputStream fos = new FileOutputStream(target))
    {
            // stuff
        }
    }
    catch (Exception e) {
        // stuff
    }

Конкретно определение ресурсов:

try (InputStream fis = new FileInputStream(source);
        OutputStream fos = new FileOutputStream(target))

Есть ли в Java другое место, где разделяются операторы в блоке скобокдопустимо?

Единственное другое время, которое я могу вспомнить, это цикл for

for ( ; ; )

, но это не совсем то же самое, так как должно быть ровно 2 ; с, а операторыразделены ,, как в

for (int i = 1,  j = 100;  i <= 100, j > 0;  i = i-1, j = j-1)

Итак, мой вопрос: откуда появился этот синтаксис?Есть ли причина, по которой операторы разделяются ; вместо ,?Есть ли еще один сопоставимый язык, который имеет аналогичное использование ; разделенных операторов внутри блока ()?Я не могу вспомнить пример в Java, C или Python.

Ответы [ 2 ]

7 голосов
/ 29 июля 2011

Как правило, операторы оканчиваются точкой с запятой в Java.Обратите внимание, что try-with-resources отличается от назначения, подобного int i = 1, j = 100;, потому что не требует, чтобы каждая инициализируемая вещь была одного типа.На самом деле это просто серия операторов присваивания, заключенных в скобки.

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

0 голосов
/ 29 июля 2011

Ну, у него нет точек с запятой, но у Common Lisp есть несколько конструкций, которые следуют этому шаблону. Например, чтобы привязать некоторые значения к переменным в ограниченной области (по сути, что делает «попытка с ресурсами»):

(let (x 5) (y 10) (z 100)
  (...))

Он имеет аналогичные вещи для обработки условий (исключений), и вы также можете написать свои собственные конструкции по мере необходимости, которые, вероятно, будут выглядеть одинаково. Если вы представляете (x 5) как int x = 5;, вы можете увидеть параллель.

...