Использование неизменяемой коллекции гуавы в качестве параметра метода и / или типа возвращаемого значения

Я пытаюсь определить, какие лучшие практики будут для ImmutableList. Ниже приведен упрощенный пример, который поможет ответить на мои вопросы:

Пример:

public ImmutableCollection<Foo> getFooOne(ImmutableList<Foo> fooInput){ 
   //.. do some work
   ImmutableList<Foo> fooOther = // something generated during the code
   return fooOther;
}

public Collection<Foo> getFooTwo(List<Foo> fooInput){
   //.. do some work
   List<Foo> fooOther = // something generated during the code
   return ImmutableList.copyOf(fooOther);
}

public void doSomethingOne(){
  ImmutableCollection<Foo> myFoo = getFooOne(myList);
  ...
  someOtherMethod(myFoo);
}

public void doSomethingTwo(){
  Collection<Foo> myFoo = getFooOne(myList);
  ...
  someOtherMethod(myFoo);
}

Мои вопросы:

Что имеет смысл использовать в приложении? [doSomethingOne и getFooOne] или [doSomethingTwo and fooTwo]? Другими словами, если вы знаете, что используете ImmutableCollections, имеет ли смысл продолжать приводить туда-сюда и делать copyOf (), или просто использовать Immutable везде?

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

Если пользователь попытается добавить что-либо в неизменяемый список, будет сгенерировано исключение. Поскольку они могут не знать об этом, не имеет ли больше смысла явно возвращать ImmutableCollection вместо Collection?

Ответы на вопрос(5)

Ваш ответ на вопрос