com isso:class WebHelper { public static String caminhoPao(char separador, String nivel1) { return separador + " " + nivel1; } public static String caminhoPao(char separador, String nivel1, String nivel2) { StringBuilder caminho = new StringBuilder(separador + " " + nivel1); return caminho.append(" ") .append(separador) .append(" ") .append(nivel2) .toString(); } public static String caminhoPao(char separador, String nivel1, String nivel2, String nivel3) { StringBuilder caminho = new StringBuilder(separador + " " + nivel1); return caminho.append(" ") .append(separador) .append(" ") .append(nivel2) .append(" ") .append(separador) .append(" ") .append(nivel3) .toString(); }}Esta implementacao problemas mais e menos evidentes (problemas de projeto, nao de implementacao).O problema mais evidente e a duplicacao, ou seja, o metodo viola o Principio de Projeto DRY: nao ha reaproveitamento de codigo, os metodos tem o mesmo proposito, mas implementam toda a funcionalidade novamente. Como seria se precisassemos de quatro niveis?O problema menos evidente e a rigidez, a falta de flexibilidade para o caso de, no futuro, precisarmos de mais niveis. Esta rigidez tambem viola um Principio de Projeto pouco conhecido, o ZOI, Zero One Infinity Rule, em portugues Regra do Zero Um Infinito.O ZOI afirma que nao deve ser imposto qualquer limite arbitrario de instancias de qualquer entidade. Em outras palavras, uma entidade deve ser totalmente proibida, ou uma instancia pode ser aceita, ou entao qualquer numero de instancias. E a tipica sensacao de, por exemplo, se sao aceitos dois argumentos, entao por que nao tres? E por que nao quatro? Deveria haver um limite?<off-topic>Isaac Asimov em seu livro "Os proprios Deuses" afirma que "o numero 2 e ridiculo e nao deveria existir", se referindo a universos no sentido de, se tu aceitas que existe 2 universos, ou seja, que nao existe um unico universo, entao tens que aceitar a possibilidade de existir n universos.</off-topic>Toda esta explicacao inicial e para embasar e dar motivacao a aplicacao de VARARGS, que e um modo mais elegante de permitir um numero variavel de argumentos em um metodo/funcao, consolidando uma Funcao Variadica. Cada linguagem tem uma notacao especial para definir Funcoes (ou Metodos) Variadicas, em Python e usado *args, ja em Java e usado Tipo... args. A seguir a implementacao em Java:class WebHelper { public static String caminhoPao(char separador, String nivel1, String... demaisNiveis) { StringBuilder caminho = new StringBuilder(separador + " " + nivel1); for (String nivel : demaisNiveis) { caminho.append(" ") .append(separador) .append(" ") .append(nivel); } return caminho.toString(); }}Com essa assinatura no metodo fazemos com que o separador e o nivel1 sejam argumentos obrigatorios sendo opcional o ultimo argumento, ou seja, passar os niveis 2, 3 e assim por diante. A variavel definida no parametro variavel e um array do tipo especificado e pode ser iterado para tratar os valores recebidos. Com a implementacao acima e possivel fazer qualquer uma das chamadas abaixo sem problemas:// demaisNiveis = [] e Imprime: > HomeSystem.out.println(WebHelper.caminhoPao('>', "Home"));// demaisNiveis = [] e Imprime: > Home > EletronicosSystem.out.println(WebHelper.caminhoPao('>', "Home", "Eletronicos"));// demaisNiveis = ["Eletronicos", "TV's"] e Imprime: > Home > Eletronicos > TV'sSystem.out.println(WebHelper.caminhoPao('>', "Home", "Eletronicos", "TV's"));// demaisNiveis = ["Eletronicos", "TV's", "LED"] e Imprime: > Home > Eletronicos > TV's > LEDSystem.out.println(WebHelper.caminhoPao('>', "Home", "Eletronicos", "TV's",