'Java: Avoid too many parameters in constructor
I have multiple service classes ServiceTest1, ServiceTest2, SeviceTest3
I have a factory class UserFactory, which creates a new User instance on every request
UserFactory has a method createUser() which gets called for every request
Currently, createUser looks something like this
public User createUser(){
return new User(new ServiceTest1(), new ServiceTest2(), new SeviceTest3());
}
These
Serviceclasses are stateless though, so I want to avoid creating a new instance on every request,There might be more
Seviceclasses in future, I want to avoid cluttering the constructor with too many parameters
What would be the good practice to fix this?
Is it good if I let these Service classes be singleton classes? and have a new class named ServiceFactory, which provides these singleton services
and then, I can just place the ServiceFactory instance in the constructor new User(ServiceFactoy.getInstance())
Solution 1:[1]
How about creating private static final ServiceTest in User class ?
Since the Services are stateless, just put them in to User, so you won't have too many parameters even if you have a new Service. Also, you won't create Service instance on every request.
public class User {
private static final ServiceTest1 serviceTest1 = new ServiceTest1();
private static final ServiceTest2 serviceTest2 = new ServiceTest2();
// ...
}
Solution 2:[2]
I like the idea with the ServiceFactory, but I would definitely not use a singleton. You could use an interface as parameter type. This interface can then be implemented by your UserFactory or a member of it.
Your classes can easily be tested with mocks. Whether a service is reused or not (may change in future), is up to the implementation of the interface:
public class UserFactory {
...
public UserFactory(ServiceRegistry registry) {
this.registry = registry;
public User createUser() {
return new User(registry);
}
...
}
public interface ServiceRegistry {
ServiceTest1 getServiceTest1()
...
}
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | |
| Solution 2 | rmunge |
