【问题标题】:Why doesn't Java have a way of specifying unescaped String literals?为什么 Java 没有指定非转义字符串文字的方法?
【发布时间】:2010-10-12 01:13:37
【问题描述】:

在 C# 中,如果您希望字符串按字面意思理解,即忽略转义字符,您可以使用:

string myString = @"sadasd/asdaljsdl";

但是,Java 中没有等价物。 Java没有包含类似的东西有什么原因吗?

编辑:

在查看了一些答案并思考之后,我真正要问的是:
是否有任何令人信服的论点反对将此语法添加到 Java 中?一些负面的,我只是没有看到?

【问题讨论】:

    标签: c# java language-comparisons


    【解决方案1】:

    Java 一直让我印象深刻,因为它是一种极简主义语言 - 我想既然逐字字符串不是必需品(例如属性),它们就没有被包括在内。

    例如,在 C# 中,有许多快速的方法来执行属性之类的操作:

    public int Foo { get; set; }
    

    和逐字字符串:

    String bar = @"some
    string";
    

    Java 倾向于避免尽可能多的语法糖。如果你想要一个字段的 getter 和 setter,你必须这样做:

    private int foo;
    
    public int getFoo() { return this.foo; }
    public int setFoo(int foo) { this.foo = foo; }
    

    并且字符串必须被转义:

    String bar = "some\nstring";
    

    我认为这是因为 C# 和 Java 在很多方面都有不同的设计目标。 C# 发展迅速,许多功能不断添加,但其中大部分往往是语法糖。另一方面,Java 是关于简单性和易于理解的。最初创建 Java 的许多原因是对 C++ 语法复杂性的反应。

    【讨论】:

    • Java 7 也将具有属性 :)
    • 很难将一种可以编写“new HashMap
    • 嘿,Java 只是一种非常具体的“极简主义”。我明白你的意思,我同意。但同时,它也是一种非常庞大和臃肿的语言,试图成为所有人的一切。 :) 但是,是的,Java 似乎不喜欢快捷方式。
    • Sun 对不包括无符号类型的解释类似于“大多数人不知道那些是什么”,这让我仍然感到震惊。
    • @jalf - 说得好,“不喜欢捷径”比“极简主义”更准确:)
    【解决方案2】:

    我觉得“为什么”问题很有趣。 C# 是一种较新的语言,并试图改进其他语言(如 Java)的缺点。 “为什么”问题的简单原因是 - Java 标准没有像 C# 中那样定义 @ 运算符。

    【讨论】:

    • 只是吹毛求疵:@ 不是运算符。它只是逐字字符串文字语法的一部分。
    • 感谢乔恩的澄清。
    • C++ 甚至比 Java 还要古老,但它很久以前就支持原始字符串文字。 Java 规范也更新了,但即使在更新之后,它仍然与其他语言相去甚远
    【解决方案3】:

    就像说的那样,主要是当你想转义字符时是为了正则表达式。在这种情况下使用: Pattern.quote()

    【讨论】:

      【解决方案4】:

      我认为其中一个原因是正则表达式(这是这类字符串文字的主要原因)直到 Java 1.4 才成为 Java 平台的一部分(如果我没记错的话)。当语言被定义时,根本就没有那么多需要。

      【讨论】:

      • OTOH,内联 SQL 在过去更常见。
      • @Tom:是的,但是鼓励 SQL 注入攻击在优先级列表中并不高;-) PreparedStatements 没有转义问题。
      【解决方案5】:

      Java(不幸的是)没有这样的东西,但是Groovy does

      assert '''hello,
      world''' == 'hello,\nworld'
      //triple-quotes for multi-line strings, adds '\n' regardless of host system
      assert 'hello, \
      world' == 'hello, world' //backslash joins lines within string
      

      当我做一些 .NET 工作时,我真的很喜欢 C# 的这个特性。它对于剪切和粘贴 SQL 查询特别有用。

      【讨论】:

      • 这就是我要找的。但是 OP 询问转义字符; Groovy 会忽略那些带有斜线的字符串,而不是三引号。
      【解决方案6】:

      我不确定为什么,但你可以通过转义转义字符来做到这一点。由于所有转义字符前面都有反斜杠,因此通过插入双反斜杠可以有效地取消转义字符。例如"\now" 将产生一个换行符,然后是字母 "ow" 但 "\now" 将产生 "\now"

      【讨论】:

        【解决方案7】:

        我认为这个问题就像:“为什么 java 不像 Python 那样对缩进敏感?” 提到的语法是一种糖,但它是多余的(多余的)。

        【讨论】:

          【解决方案8】:

          您应该会发现您的 IDE 可以为您解决问题。 如果您在字符串中间并将原始文本复制粘贴到其中,它应该为您转义文本。

          PERL 有多种设置字符串文字的方法,有时希望 Java 也支持这些方法。 ;)

          【讨论】:

          • 离题:这是 Perl,不是 PERL。
          猜你喜欢
          • 2020-10-18
          • 1970-01-01
          • 2012-09-14
          • 2015-10-16
          • 1970-01-01
          • 2018-08-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多