# Searching For Suspicious (Superfluous) Interfaces With IntelliJ

In enterprise apps interfaces are at least suspicious in case:

There is and very likely will be a 1:1 relation between the interface and its realization through the whole application lifecycle
You cannot name an interface properly any more and are forced to use naming conventions like "Impl" or "I" to avoid name clashes


IntelliJ comes with structural search. "Structural Search" is a (Groovy/Java) programmable search facility with that you can easily find all (probably superfluous) interfaces with only a single implementation:


Go to: Search -> Search Structurally
Push: Copy Existing Template -> class-based -> interface that is not implemented or extended
Push: "Edit Variables" and replace the content of the "Script Text" with com.intellij.psi.search.searches.ClassInheritorsSearch.search(__context__).findAll().size() == 1


The found interfaces are probably superfluous if you cannot clearly explain their intentions/purpose (decoupling, extensibility etc. is not good enough for a justification).

[Warning: this script is not perfect: it will also find cases of interface inheritance.]
