Предположение 1) Ресурсы, загруженные через classpath, не имеют пространства имен, они имеют только имя файла.
Ресурсы, загруженные из пути к классам, на самом деле идентифицируются путем, а не простым именем файла. Вы можете просматривать части каталогов путей к файлам как образующие пространства имен.
Также, если вы загружаете, используя Class.getResourceAsStream(String pathname)
, путь, который не начинается с "/", будет интерпретироваться как относительно пути к пакету классов.
Механизм пути к классам работает путем наложения пространств имен каждого файла JAR и т. Д. На путь к классам. Таким образом, вы можете иметь несколько ресурсов в разных JAR-файлах с одним и тем же путем, но на самом деле будет виден только один. (Вы описываете это позже как «столкновение».) Но с точки зрения набора видимых путей, каждое имя пути однозначно идентифицирует ресурс.
Предположение 2) Лучше всегда загружать ресурсы через classpath, а не через файловую систему, даже в модульных тестах.
Если речь идет о ресурсах приложения , то загрузка из classpath имеет определенные преимущества. Однако, если мы говорим о ресурсах, которые создаются и управляются приложением, то загрузка через classpath имеет проблемы ... потому что вы не можете записать ресурсов в classpath.
Кроме того, даже с разъяснением того, что вы подразумеваете под «ресурсом», я не думаю, что будет правильным сказать, что всегда мудрее всего загружать ресурсы через classpath. Мы не можем предвидеть все сценарии / варианты использования и, следовательно, не можем сказать, что не может быть некоторого сценария / варианта использования, где подход wisest заключается в загрузке ресурса другим способом , (Однако, если бы вы сказали «обычно» или «обычно» вместо «всегда», я бы согласился с этим предположением.)
Заключение 3) Поэтому у ресурсов всегда должны быть уникальные имена файлов, иначе могут возникнуть коллизии.
Если ресурсы, поступающие из разных JAR-файлов на пути к классам, имеют неуникальные пути, то вы получите своего рода коллизию, и один или другой из ресурсов не будет загружаться (по крайней мере, не через обычные API загрузчика классов). Но это может быть именно тем, что вы хотите, чтобы произошло!
Есть ли недостатки в моих предположениях или в моем заключении?
Предположение 1) ложно на первый взгляд, но оно может быть истолковано таким образом, что делает его истинным.
Вывод 3) логически следует из переосмысленного предположения 1).
Предположение 2) также ложно, но может быть переосмыслено таким образом, чтобы это было правдой: то есть расслабиться «всегда» и определить, что вы подразумеваете под «ресурсом». Однако это предположение не является логически необходимым для заключения.