Oi Danilo,
Pois é, nesse exemplo é realmente possível chamar o método diretamente, sem passar pela validação.
Daria para evitar isso reestruturando os pacotes da aplicação para o modelo package by feature e tornando o método atualizarSalario
package private, pois assim seria possível garantir que apenas as classes do mesmo pacote teriam acesso a esse método.
Outra alternativa seria deixar a lógica dentro da classe Funcionario
, mas isso vai fazer ela ficar maior e menos coesa.
Perceba então que nem sempre teremos uma solução "ideal", pois sempre haverá vantagens/desvantagens e devemos avaliar qual solução se encaixa melhor para cada situação.
Bons estudos!