Создание глобальной переменной или создание экземпляра внутри функции - PullRequest
0 голосов
/ 17 декабря 2018

Это не вопрос кодирования, а связанный с концепцией кодирования.У меня есть класс обслуживания с некоторыми методами, а также у этого класса есть два закрытых метода для анализа и проверки URL.

private boolean isUrlFormatValid(String url) {
        Pattern pattern = Pattern.compile("^(https?:\\/\\/)?(www\\.)?([\\w]+\\.)+[\u200C\u200B\\w]{2,63}\\/?$");
        Matcher matcher = pattern.matcher(url);
        if (matcher.matches()) {
            return true;
        } else {
            LOG.error("Url format is not valid");
            return false;
        }
    }

    private String parseUrlDomain(String url) throws Exception {
        Pattern p = Pattern.compile("^(?:https?:\\/\\/)?(?:www\\.)?((?:[\\w]+\\.)+\\w+)");
        Matcher m = p.matcher(url);
        if (m.matches()) {
            System.out.println(m.group(1));
            return m.group(1);
        }
        throw new Exception("Url domain is not parsed ");
    }

Эти коды работают хорошо, но я не уверен насчет некоторых моментов, таких как:

1-Как вы видите, оба метода имеют общие коды, создавая экземпляры pattern и matcher .Должен ли я создать их экземпляр в начале класса в качестве глобальной переменной?Если так, в чем причина этого и в чем его преимущество.

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

Следовательно, есть ли лучший метод для этого?Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 17 декабря 2018

Вы действительно нашли хороший способ сделать ваш код быстрее.И это также распространенная проблема при медленном выполнении регулярных выражений.* * * * * * * * * * * * * * * * * *

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *} * * * * * * * * * * * * * * * * * * * 100 * * * * * * * * *) * * * * * * * * * * * * '*' * '' '* 100' '*' * '*' 100 '* ".Ваше второе замечание: задайте себе следующий вопрос: важен ли результат этой операции для звонящего?Если ответ «да», выведите какое-то исключение, чтобы указать, что пошло не так.Если нет, вы можете зарегистрировать ошибку для поддержки последующей отладки.

0 голосов
/ 17 декабря 2018
  1. Ваш шаблон основан на определенном регулярном выражении, это не значит, что у вас есть только одно регулярное выражение.Таким образом, лучше, если вы получаете шаблон как и когда требуется.Опять же, что касается Matcher, это основано на вашей схеме.Таким образом, вы создали его как требуется.Назначение им переменной уровня класса будет иметь смысл, если у вас есть только одно регулярное выражение для вашего URL для проверки.
  2. Для ошибок - обычно вы бросаете исключение (выдает исключение - второй случай), когда вы хотите, чтобы вызывающий объектAPI, чтобы заботиться о сценарии исключения.Предположим, что есть два вызывающих абонента parseUrlDomain , и эти вызывающие абоненты хотят по-разному обрабатывать исключение при разборе URL-адреса, тогда имеет смысл иметь предложение throws.С другой стороны, когда вы очень четко понимаете, как должны обрабатываться ошибки или исключения, вы обычно ловите, регистрируете.(первый случай в вашем фрагменте кода.)
0 голосов
/ 17 декабря 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...