Прежде всего, это не всегда хорошая идея сделать защитную копию. Вы хотите делать это только с изменяемыми классами, которые не могут обеспечить выполнение контракта, требуемого вашей бизнес-логикой (например, коллекции).
Ваш прекрасный пример. FilenameFilter является неизменным - ничто не может изменить его через этот интерфейс. Не стесняйтесь передавать его по желанию. Единственная потенциальная проблема - это многопоточность, и это довольно редко.
Более общим решением (для классов, которые на самом деле являются проблемой, подобными коллекциям) будет заключаться в том, чтобы обернуть коллекцию в класс, а не скопировать ее. Если вы поместите его в класс бизнес-логики, вы можете ограничить доступ, пока не будете уверены, что он не нарушит ваши правила бизнес-логики, а затем можете свободно передавать его повсюду.
Вы заметите, что JDK почти никогда не передает коллекции. Это специально, и точную причину для шаблона «Копирование» вы рассматриваете. Обычно JDK передает массив, и большинство коллекций имеют довольно простой способ создания копии своего содержимого для передачи.
Копирование объекта на самом деле встречается крайне редко - коллекции и массивы являются основными, о которых нужно заботиться. Большинство других объектов могут защитить себя довольно хорошо, если они даже наполовину прилично спроектированы.