Uso de la colección inmutable de guayaba como parámetro de método y / o tipo de retorno

Estoy tratando de determinar cuáles serían las mejores prácticas para una ImmutableList. A continuación se muestra un ejemplo simplista que ayudará a generar mis preguntas:

Ex

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);
}

Mis preguntas

¿Qué tiene más sentido usar en una aplicación? [doSomethingOne y getFooOne] o [doSomethingTwo and fooTwo]? En otras palabras, si sabe que está utilizando ImmutableCollections, ¿tiene sentido seguir emitiendo de un lado a otro y haciendo copyOf (), o simplemente usar Immutable en todas partes?

Estos ejemplos son métodos públicos que podrían implicar que otras personas los usan. ¿Cambiaría alguna de estas respuestas si los métodos fueran privados y se usaran internamente?

Si un usuario intenta agregar algo a una Lista inmutable, se generará una excepción. Debido a que pueden no ser conscientes de esto, ¿no tendría más sentido devolver explícitamente una ImmutableCollection en lugar de una Collection?

Respuestas a la pregunta(10)

Su respuesta a la pregunta