Будут ли конфликтующие методы с рефакторингом в веб-приложении Java-Struts? - PullRequest
2 голосов
/ 30 ноября 2011

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

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

Возможно ли это?или просто мое недоразумение о раздорах, статических методах, веб-приложениях и т. д.

Заранее спасибо, Алексей Блю.

Ответы [ 3 ]

2 голосов
/ 30 ноября 2011

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

К вашему сведению, существует метод закрытия, который делает именно то, что вы описываете в Apache Common IO, IOUtils . Это популярная библиотека, которую вы можете использовать.

1 голос
/ 30 ноября 2011

Это обычная практика, например, посмотрите на класс Closeables в Гуаве.Кстати, вам нужен только один метод, чтобы можно было закрыть практически все в Java:

public static void closeQuietly(Closeable closeable) {
  if (closeable != null) {
    try {
      closeable.close();
    } catch (RuntimeException re) {
      // Do something or ignore...
    }
  }
}

Поскольку все Streams и Readers реализуют интерфейс Closeable, этого одного метода должно хватить для всех ваших потребностей.

В общем случае это не приведет к конфликту, если только вы не попытаетесь прочитать из потока, скажем, Thread-A, где Thread-B закрывает поток.Но если бы это было так, то вы бы имели этот спор с или без этого рефакторинга.Исключительно этот рефакторинг не будет вносить никаких дополнительных разногласий.

1 голос
/ 30 ноября 2011

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

Методы в целом могут выполняться одновременно.Синхронизация всегда будет работать с объектами, и поэтому конфликт не должен возникать, если объекты, которые вы используете в этих методах, совершенно различны.

...