【问题标题】:Java try-with-resources syntax irregularityJava try-with-resources 语法不规则
【发布时间】:2011-07-28 23:35:41
【问题描述】:

所以我查看了 java 7 的一些新特性,包括 try-with-resources 位。

我了解它的工作原理和一切,我只是注意到用于指定资源的语法有点奇怪。

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 个 ;s,并且语句用 , 分隔,如

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

所以我的问题是,这个语法是从哪里来的?这些语句是; 分隔而不是, 分隔的原因吗?是否还有另一种类似的语言在 () 块内使用类似的 ; 分隔语句?我想不出 java、C 或 python 的例子。

【问题讨论】:

    标签: java syntax java-7 try-with-resources


    【解决方案1】:

    通常,Java 中的语句以分号结尾。请注意,try-with-resources 与 int i = 1, j = 100; 之类的赋值不同,因为它不需要初始化的每个事物都具有相同的类型。它实际上只是用括号括起来的一系列赋值语句。

    也就是说,如果某种语法易于理解,我认为确实不需要任何先例。

    【讨论】:

    • I don't think there really needs to be any precedent for using a certain syntax if it's easily understood 我同意,但是对于为什么选择新语法而不是其他语法,必须有一个体面的解释,特别是如果有其他与已经存在的一致的方法来做到这一点。
    • @Falmarri:考虑到我所说的关于同一类型的多个变量的赋值(这只是一个陈述),我不认为用逗号分隔会与已经存在的一致。就像你说的那样,在 Java 中确实没有很多其他地方允许在这样的括号内声明语句,所以这是一种新的。
    【解决方案2】:

    嗯,它没有分号,但是 Common Lisp 有几个遵循这种模式的结构。例如,将一些值绑定到有限范围内的变量(本质上是“使用资源尝试”正在做的事情):

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

    它具有类似的条件(异常)处理内容,您也可以根据需要编写自己的构造,看起来可能相同。如果您将(x 5) 想象为int x = 5;,您可以看到相似之处。

    【讨论】:

    • 我认为 lisp 与 java 的距离差不多。
    • @Falmarri:我不会反对。这是我想到的第一件事,有任何相似之处:)
    猜你喜欢
    • 1970-01-01
    • 2014-05-21
    • 2013-07-21
    • 1970-01-01
    • 2013-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多