Как Вы имеете дело со строками, которые имеют структуру?

tl; dr

См. JEP 330 , описывающий эту новую функцию в OpenJDK 11 и более поздних версиях, где java MyClass.java будет компилировать и запускать один файл исходного кода.

Java 11

Вы нашли новую функцию в реализациях Java 11, построенных на OpenJDK 11. Для удобства теперь можно скомпилировать один файл .java и [ 1114] выполняется просто путем вызова java в командной строке.

java автоматически вызывает javac для выполнения компиляции. Полученный скомпилированный класс запускается.

См. JEP 330: Запуск однофайловых программ с исходным кодом . Процитируем, что JEP:

Однофайловые программы - где вся программа помещается в один исходный файл - распространены на ранних этапах изучения Java и при написании небольших служебных программ. В этом контексте, это чистая церемония, чтобы скомпилировать программу перед ее запуском. Кроме того, один исходный файл может компилироваться в несколько файлов классов, что добавляет издержки на упаковку к простой цели «запустить эту программу». Желательно иметь возможность запускать программу непосредственно из исходного кода с помощью средства запуска Java:

java HelloWorld.java

blockquote>

И, да, эта простая функция должна была быть построена десятилетия назад. чтобы помочь бесчисленным начинающим, пытающимся изучать Java.


Предупреждение: реализация Java , а не , построенная из исходного кода OpenJDK, может включать или не включать такую ​​функцию. В этом разница между JEP (только OpenJDK ) и JSR (определено в спецификациях Java ).

5
задан Erik Forbes 9 February 2009 в 23:27
поделиться

9 ответов

Добро пожаловать в мир программирования!

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

Проблема проверки адреса электронной почты, например, довольно хитра. Регулярные выражения, которые различные люди предлагают принятию адреса электронной почты, например, обычно любой "слишком трудны" (не принимайте все), или "слишком свободный" (принимают недопустимые вещи). Первый хит Google для 'regex "адрес электронной почты"', например, говорит:

Регулярное выражение, о котором я получаю большую часть обратной связи, не говоря уже об отчетах "об ошибке", является тем, которое Вы найдете прямо на домашней странице этого сайта: \b [A-Z0-9. _ % +-] + [A-Z0-9.-] +. [A-Z] {2,4 }\\b Анализируют это регулярное выражение с RegexBuddy. Это регулярное выражение, я требую, соответствует любому адресу электронной почты. Большая часть обратной связи, которую я получаю, опровергает то требование путем показа одного адреса электронной почты, которому не соответствует этот regex.

Факт, что или не является действующим электронным адресом, сложная проблема, та, что данная программа могла бы или не могла бы хотеть решать. Проблема URL еще хуже, особенно учитывая возможность злонамеренных URL.

Идеально, у Вас могут быть библиотека или системный вызов, который решает проблемы этого вида вместо того, чтобы делать что-либо самих (окна Microsoft называет пользовательское диалоговое окно, чтобы позволить пользователю выбирать или создавать файл, начиная с проверки имен файлов другая хитрая проблема). Но Вы не можете всегда рассчитывать на наличие соответствующего системного вызова данной "значимой строки" также.

Я сказал бы что там не универсальное решение проблемы строк со структурой. Скорее это - основная проблема, которая кажется правильной, когда Вы разрабатываете свое приложение. В процессе собирающихся требований для Вашего приложения необходимо определить, какие данные приложение примет и как значимый, что данные будут к приложению. И это - то, где вещи становятся хитрыми, так как можно заметить возможность, что приложение может вырасти способами, которыми босс или клиент, возможно, не думали - или приложение может на самом деле вырасти способами который ни один из Вас мысль. Таким образом приложение должно быть немного более гибким, чем, что походит на минимум, НО только немного. Это не должно также быть настолько гибко, Вы увязаете.

Теперь, если Вы решаете, что необходимо проверить/интерпретировать и т.д. данную строку, поместив ту строку в объект, или хеш может быть хорошим подходом - это - один способ, которым я знаю, чтобы удостовериться, что интерфейс ясен. Но хитрая вещь решает, в каком количестве проверки или интерпретации Вы нуждаетесь.

Принятие этих решений является таким образом искусством - нет никаких догматических ответов той работы здесь.

2
ответ дан 18 December 2019 в 12:02
поделиться

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

Вы могли бы также рассмотреть использование встроенной системы. Сеть. Класс MailAddress для этого, поскольку это обеспечивает проверку для адресов электронной почты.

2
ответ дан 18 December 2019 в 12:02
поделиться

"Строки со структурой" являются признаком общего запаха кода "Примитивная Навязчивая идея".

Средство состоит в том, чтобы наблюдать тесно за дублированием в коде, который проверяет или управляет частями этих структур. При первой подсказке дублирования - но не прежде - извлекают класс, который инкапсулирует структуру, и найдите проверки и запросы там.

9
ответ дан 18 December 2019 в 12:02
поделиться

Строки являются строками. Если Вам нужны Ваши строки, чтобы быть более умными, чем средние строки, затем анализирующие их в структурный объект как Вы, описывают, была бы хорошая идея. Я использовал бы regex, чтобы сделать это.

1
ответ дан 18 December 2019 в 12:02
поделиться

Регулярные выражения являются Вашим другом когда дело доходит до форматирования строк. Вы могли также сохранить каждую часть отдельно в структуре, чтобы не проходить проблему использовать регулярные выражения каждый раз, когда Вы хотите использовать их. например.

struct EMail
{
    String BeforeAt = "johndoe123";
    String AfterAt = "gmail.com";
}

Struct URL
{
    String Protocol = "http";
    String Domain = "sub.example.com";
    String Path = "stuff/example.html";
}
1
ответ дан 18 December 2019 в 12:02
поделиться

Ну, если Вы хотите сделать несколько различных видов вещей с объектом EmailAddress, те другие действия не должны проверять, является ли это действующий электронный адрес, так как объект EmailAddress, как гарантируют, будет иметь допустимую строку. Вы могли выдать исключение в конструкторе или использовать метод фабрики или безотносительно "Одной Истинной Методологии" подход, который Вы используете.

0
ответ дан 18 December 2019 в 12:02
поделиться

Лично, мне нравится идея строгого контроля типов, поэтому если бы я все еще работал на таких языках, то я пошел бы со стилем Вашего второго примера. Единственная вещь, которую я изменил бы, могла бы состоять в том, чтобы использовать более "подобную броску" структуру, как EmailAddressFromString(String), это генерировало новое EmailAddress объект (или переданный соответствие, если строка не была правильной), поскольку я - немного поклонник приложения Венгерская запись.

Эта целая проблема, несущественно, покрыта вполне прилично Joel в http://www.joelonsoftware.com/articles/Wrong.html, если Вам интересно.

0
ответ дан 18 December 2019 в 12:02
поделиться

Я соглашаюсь с вызовами сильно ввести объект, но для тех случаев, где Вы анализируете от строки до объекта, ответ прост: обработка ошибок.

Существует два общих способа обработать ошибки: исключения и условия возврата. Обычно, если Вы ожидаете получать плохо сформированные данные, затем необходимо возвратить сообщение об ошибке. Для случаев, где вход не ожидается, затем я выдал бы исключение. Например, Вы могли бы передать в плохом сформированном адресе электронной почты, таком как 'боб' вместо 'bob@gmail.com'. Однако для нулевых значений, Вы могли бы выдать исключение, поскольку Вы не должны пытаться сформировать электронное письмо из пустого указателя.

Возвращаясь к Вашему вопросу, я действительно думаю, что Вы получаете что-то путем кодирования структуры в объект. А именно, только необходимо проверить это, строка представляет действующий электронный адрес в одном определенном месте, таком как конструктор. В другом месте Ваш код является бесплатным предположить, что объект EmailAddress доступен, и Вы не должны полагаться на изворотливые классы с именами как 'EmailHelper' или некоторые такой.

0
ответ дан 18 December 2019 в 12:02
поделиться

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

Для создания адреса электронной почты, необходимо будет, рано или поздно, сделать что-то как:

EmailAddress(String email)

или метод set

SetEmailAddress(String email)

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

Я, как другие указали, буду использовать регулярные выражения.

Наличие класса EmailAddress было бы полезно, если Вы планируете необходимость работать, определенные операции на Вашей хранившей информации позже (скажите, получают доменное имя только, материал как этот).

0
ответ дан 18 December 2019 в 12:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: