Почему в Java нет способа указать неэкранированные строковые литералы? - PullRequest
6 голосов
/ 08 марта 2009

В C #, если вы хотите, чтобы строка воспринималась буквально, то есть игнорировать escape-символы, вы можете использовать:

string myString = @"sadasd/asdaljsdl";

Однако в Java нет эквивалента. Есть ли какая-то причина, по которой Java не включила нечто подобное?

Edit:

После рассмотрения некоторых ответов и обдумывания я действительно спрашиваю:
Есть ли веские аргументы против добавления этого синтаксиса в Java? Что-то негативное, что я просто не вижу?

Ответы [ 8 ]

5 голосов
/ 08 марта 2009

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

Например, в 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 ++.

2 голосов
/ 08 марта 2009

Как сказано, в основном, когда вы хотите экранировать символы для регулярных выражений. В этом случае используйте: Pattern.quote ()

2 голосов
/ 08 марта 2009

Я нахожу это забавными вопросами "почему". C # - более новый язык, и он пытается улучшить недостатки других языков, таких как Java. Простая причина вопроса «почему» в том, что стандарт Java не определяет оператор @, такой как в C #.

1 голос
/ 09 марта 2009

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

Мне очень понравилась эта особенность C #, когда я немного поработал .NET. Это было особенно полезно для вырезанных и вставленных SQL-запросов.

1 голос
/ 08 марта 2009

Я думаю, что одной из причин является то, что регулярные выражения (которые являются основной причиной для подобных литералов String) не являются частью платформы Java до Java 1.4 (если я правильно помню). Когда язык был определен, в этом просто не было нужды.

0 голосов
/ 08 марта 2009

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

В PERL имеется более широкий выбор способов установки литералов String, и иногда требуется, чтобы Java также поддерживал их. ;)

0 голосов
/ 08 марта 2009

Я не уверен в том, почему, но вы можете сделать это, избежав экранирования. Поскольку всем escape-символам предшествует обратная косая черта, вставив двойную обратную косую черту, вы можете эффективно отменить escape-символ. например «\ now» выдаст новую строку, после чего буквы «ow», но «\ now» выдаст «\ now»

0 голосов
/ 08 марта 2009

Я думаю, что этот вопрос звучит так: «Почему java не чувствителен к отступам, как Python?» Упомянутый синтаксис является сахаром, но он является избыточным (излишним).

...