spring-projects / spring-framework

Spring Framework
https://spring.io/projects/spring-framework
Apache License 2.0
56.45k stars 38.09k forks source link

Allow creation of immutable collections through CollectionFactory [SPR-16797] #21337

Closed spring-projects-issues closed 9 months ago

spring-projects-issues commented 6 years ago

Mark Paluch opened SPR-16797 and commented

Modelling application classes as immutable objects is a widely used pattern in Java and Kotlin which constantly gains adoption. We should allow creation of immutable collection types (Map, List, Set) through CollectionFactory or an adequate API that allows specification of the target type and the elements the result should contain.

It would be great to support:

 


Issue Links:

2 votes, 7 watchers

spring-projects-issues commented 6 years ago

John Butler commented

Juergen, I was the submitter for the DATAMONGO-1964 ticket that triggered this. I was hoping to be able to contribute. If you have not started work on it and I would have time (say a week or set as I need to set up my env for your coding standards) I would like to submit a branch. I was thinking that the simplest change to support immutables (specifically Guava's) would be to add methods in CollectionFactory that take the contents of the Collection / Map

public static <E> Collection<E> createCollectionOf(Class<?> collectionType, Iterable<? extends E> elements) {
... 
// Add support for ImmutableCollection, ImmutableList, ImmutableMultiset, ImmutableSet
} 

 

public static <K, V> Map<K, V> createMapOf(Class<?> mapType, Iteable<? extends Map.Entry<? extends K, ? extends V> elements) {... 
// Add support for ImmutableMap, ImmutableBiMap
// I don't think code can support ImmutableSortedMap because code would not know what Comparator to use
}

 

Couple questions, would it make sense for these methods to have a signature that returns the requested type instead of Collection and Map?

Something like:

 public static <C extends Collection<E>, E> C createCollectionOf(Class<C> collectionType, Iterable<? extends E> elements)

public static <M extends Map<K,V>, K, V> M createMapOf(ClassM?> mapType, Iteable<? extends Map.Entry<? extends K, ? extends V> elements)
spring-projects-issues commented 6 years ago

John Butler commented

I am not sure that "Java 9 Immutable Collections" are pertinent because there is no distinct class or interface that denotes that the collection is immutable. In the case of List.of(...), it simply returns a List. Therefore the type passed to CollectionFactory would be just List with no way to determine if it was intended to be immutable. 

spring-projects-issues commented 6 years ago

John Butler commented

@jhoeller I am having issues submitting / pushing my code to the spring-framework github repo. I have signed the CLA but am getting a 403. Can you provide some help? I have access to push to my own github repo just not spring-framework's.

remote: Permission to spring-projects/spring-framework.git denied to dancerjohn.
fatal: unable to access 'https://github.com/spring-projects/spring-framework.git                       /': The requested URL returned error: 403
spring-projects-issues commented 6 years ago

Oliver Drotbohm commented

You usually create a fork of the repository into your own GitHub account, commit and push to that and then submit a pull request.

spring-projects-issues commented 6 years ago

John Butler commented

Pull request created:

Pull 1826

spring-projects-issues commented 6 years ago

Stéphane Nicoll commented

I didn't see the conversation here before closing that PR. We have dropped our optional dependency for Guava in Spring Framework 5 and I don't think that is a good idea to reintroduce it.

 

WDYT Juergen Hoeller?

spring-projects-issues commented 6 years ago

John Butler commented

If you don't want the dependency, maybe consider a mechanism for injecting additional functionality similar to Jackson modules. Let me know if that would be more acceptable and I will give it a try. Note that this ticket was spawned by a request in Spring Data MongoDB which uses CollectionFactory for marshaling user domain objects. So even if spring-core does not wish to use Guava, this is preventing users of Spring Data MongoDB from using the immutable collections is their domain objects.

spring-projects-issues commented 6 years ago

Stéphane Nicoll commented

Thanks John Butler, let me sync with Juergen and we'll get back to you.

spring-projects-issues commented 6 years ago

John Butler commented

Hi All, any thoughts about a path forward on this?

spring-projects-issues commented 6 years ago

Juergen Hoeller commented

It looks like we won't be dealing with Vavr for 5.1 which is approaching its feature freeze soon; there are a couple of related tickets that we intend to pick up for 5.2 instead. Maybe Spring Data MongoDB can introduce Vavr and Guava support in a custom fashion for the time being, just delegating to the core CollectionFactory for regular collection types?

snicoll commented 9 months ago

Checking with @mp911de, there's nothing that's needed from their side for this and we don't want to expand the scope further.