I was hoping to get some clarification from my comment on your question but here's a few options you might what to consider. I think the most straightforward and least disruptive (to your design) option is to simply to add validate to ParentEntity like this:
class ParentEntity {
public void validate(EntityRepository repo) {
return;
}
}
I'm going to assume there's something else going on in ParentEntity that you haven't shown us. Otherwise I would question why it's a class and not an interface.
This might violate one of Uncle Bob's rules (I don't know and I don't really much care) by exposing the repository to the entity instances. Regardless of that, I don't love it. It seems a little loose but on the other hand, it adds a lot of flexibility.
If that's a concern for you, you could simply pass the related entities to the ParentEntity. In order to make that work without an instanceof you could do something like this:
class ParentEntity {
public List<Integer> getEntityIds() {
return Collections.emptyList();
}
public void validate(EntityRepositoryList<ParentEntity> repoassociated) {
return;
}
}
And override getEntityIds() in AEntity. This is maybe a little better but still seems a little off to me. What I would probably do is a deeper redesign. You don't show where you decide to create an AEntity instead of a ParentEntity but wherever that happens, you would (naïvely) instantiate AEntity with references to the related entities. I say naïvely here because there's an immediate problem. If you can't instantiate a AEntity without it's dependencies, you can easily run into a cycle if an AEntity depends on other AEntity instances. Even if there never cycles, it can be a little complicated to instantiate them in the right order. I can think of few ways out of that mess.
- Lazy loaded entities. Each entity is initialized with it's id only. When details are required, then they are retrieved.
- Instantiate entities with a list of function references, each of which retrieves the actual entity when it's needed during validation.
- Instantiate the AEntity with a list of strategy pattern objects. This is similar to 1, except the entities are not lazy-loaded necessarily. The strategy object will get them after the entities are created.
If you are interested in any of these three options, let me know and I can elaborate but I'm not going to spend time on that unless you are expressly interested.