为什么Java没有指定未转义字符串字面量的方法?

6
在C#中,如果您想让一个字符串被视为字面值,即忽略转义字符,可以使用:
string myString = @"sadasd/asdaljsdl";

然而,在Java中没有相应的东西。Java为什么没有包含类似的内容呢?

编辑:

经过查看一些答案并思考,我真正想问的是:
是否有任何强有力的理由反对将此语法添加到Java中?有什么负面影响,我没有意识到吗?

8个回答

5

我认为Java一直是一种极简主义语言 - 我想,由于文本字符串不是必需品(例如属性),所以它们没有被包含在内。

例如,在C#中有许多快速的方法来处理属性:

public int Foo { get; set; }

和逐字字符串:

String bar = @"some
string";

Java倾向于尽可能避免语法糖。如果您想要为一个字段获取器和设置器,您必须这样做:

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++语法复杂性的反应。


1
Java 7 也将拥有属性 :) - unorsk
1
有时很难将一门语言描述为极简主义,比如你可以写出 "new HashMap<Integer,ArrayList<? extends .." 的代码。 - Steve B.
4
嘿,Java只在一个非常具体的意义上是“极简主义”的。我明白你的意思,也同意。但同时,它也是一种非常庞大和臃肿的语言,试图为每个人都提供所需。:) 但是,确实看起来Java不喜欢捷径。 - jalf
我仍然感到震惊,Sun公司不包括无符号类型的解释竟是“大多数人不知道那是什么”。 - Spencer Ruport
Java这门古老的编程语言似乎正在进步,关于添加原始字符串字面量的问题,请参见http://openjdk.java.net/jeps/326。 - GOXR3PLUS
显示剩余2条评论

2

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


只是挑剔一下:@ 不是一个运算符。它只是一个逐字字符串文字的语法部分。 - Jon Skeet
C++比Java更早,但早在很久之前就支持原始字符串字面量。尽管Java规范也有更新,但与其他语言相比,它仍然有一段距离。 - phuclv

2

通常情况下,当您需要转义字符时,大多数是用于正则表达式。在这种情况下,请使用:Pattern.quote()


1

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

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 使用斜杠字符串忽略这些字符,而不是三重引号。 - Noumenon

1
我认为其中一个原因是正则表达式(这是这种字符串文字的主要原因之一)直到Java 1.4之前才成为Java平台的一部分(如果我记得正确的话)。当语言被定义时,这样做并没有太大的必要。

另一方面,在过去,内联SQL更为常见。 - Tom Hawtin - tackline
@Tom:是的,但鼓励SQL注入攻击并不是我们的首要任务;-) PreparedStatements在转义方面没有问题。 - Joachim Sauer

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

0

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


0

你应该找到你的IDE为你处理这个问题。 如果你正在一个字符串中间,复制粘贴原始文本进去,它应该会为你转义文本。

PERL有更多种设置字符串字面量的方式,有时候希望Java也支持这些方式。 ;)


1
离题:应该写成 Perl,而不是 PERL。 - nxadm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接