Often we like to attach abilities to our class but it is mostly done as a delegate and not as a mixin in Java.
We will explore in this blog on implementing mixins in Java using first class collections.
First class collection means a collective object is given domain importance. It has to behave as a collection as well as a domain object.
Rule 4: Object Calisthenics by William Durand
Any class that contains a collection should contain no other member variables. If you have a set of elements and want to manipulate them, create a class that is dedicated for this set.
Each collection gets wrapped in its own class, so now behaviours related to the collection have a home (e.g. filter methods, applying a rule to each element).
Consider an example for a publication domain with two classes,
Newspaper.java which will have a list of subscribers. The usual idea would be to model it like this:
Notice that all the operations on list of subscribers have been duplicated in both the classes. Also, wouldn’t
Newspaper.java become a little too overcrowded , when you have a lot of fields and methods?
Here comes the idea of first class collections. List of subscribers can be given domain importance by making another class
Subscribers.java which will have List<Subscribers> as a field inside it.
Now how do we make
Subscribers.java behave as a
List? We can, by making
List. But that would mean implementing all the functions of
Subscribers, and you will end up getting a long class with all the functions of
Subscribers in one single class. A better approach would be to separate out the behaviour of
List and implementation of
Subscribers into separate classes. Lets try implementing an interface, that will extend the
When you design something like this, you will have to override existing
List functions to operate on your custom arrayList. Here is a snippet of how this will look like.
Now coming back to
Subscribers.java, we can have this class behave like a list by implementing ListMixin interface and overriding the getRecords() method to return the list of subscribers. All your operations on the list of subscribers will go into this class.
No more code duplication in
Newspaper.java will have to handle the logic of returning the list of subscribers who are prime users. Notice how code duplication has been avoided in both the classes. These classes will now be shorter and pull in all the necessary functions from our first class collection.