Liberar somente as interfaces como chamadas para outros módulos, sem preocupar com a impl

Tem um sistema principal. Nele tenho uma interface e uma implementação.

interface

package br.com.ghsistemas.principal.core.regras;

import br.com.ghsistemas.principal.core.enuns.StatusDoRegistroEnum;
import br.com.ghsistemas.principal.utilitario.mensagem.Mensagem;
import java.util.Collection;

public interface ValidarIncluirAlterarExcluir {

    void validarIncluir(String id, Collection<Mensagem> mensagens);

    void validarAlterar(String id, Collection<Mensagem> mensagens);

    void validarExcluir(String id, Collection<Mensagem> mensagens);

    void validarExcluirGeral(StatusDoRegistroEnum status, Collection<Mensagem> mensagens, String chave, String entidade);

}

Em um outro sistema, via pom eu chamo coloco como dependência este sistema principal. Importo esta interface para utilizar a sua implementação. import br.com.ghsistemas.principal.core.regras.ValidarIncluirAlterarExcluir;

Já trabalhei em um sistema que o programador não sabia como era a implementação.

Tem como fazer para esconder a classe de implementação ?

Ou como neste sistema principal eu somente liberar as interfaces ?

Se for expor somente as interfaces na dependência, o acesso à implementação tem que ser feita por algum mecanismo, como RMI ou EJB (or whatever), por exemplo.

Agora, se a implementação estiver no mesmo jah onde estão as interfaces, vc pode manter a implementação num pacote com escopo reduzido, e utilize uma factory para criar as instâncias das implementações retornando a interface para serem utilizadas. (as interfaces e a factory devem ter escopo público).

Blz, Pode me dar um exemplo utilizando Spring com factory ?

Pq essa complicação, não estão dentro da mesma empresa?

@javaflex, sim, mais a titulo de estudo mesmo. Pois quando eu trabalhei para uma empresa do governo e lá era assim.

Ai quero aprender a fazer também

Na minha resposta, não levei em consideração usando Spring. Mas se for o caso, o interessante seria utilizar os recursos do Spring para isso, que seria disponibilizar um bean numa configuration para que sua aplicação pudesse usar (injetar).

Tipo isso: https://www.baeldung.com/spring-factorybean, @Lucas_Camara