É verdade, no lugar do clear tem que usar:
setstring.delete(0, setstring.size());
Note que não adianta fazer:
setstring = new StringBuilder();
Pois isso recairia no mesmo problema que você teve. Você criaria um novo StringBuilder, alteraria a cópia da referência, mas a referência original continuaria apontando para o StringBuilder antigo.
Você só pode alterar objetos mutáveis por parâmetro. A string não é esse caso. Porém, é muito raro precisar alterar Strings dessa forma. Se você vai trabalhar com strings intensamente (concatenando e alterando seu conteúdo o tempo todo), aí o melhor é usar o StringBuilder mesmo.
Agora, note que sua String pode estar dentro de um objeto, e você poderia alterar a String do objeto normalmente:
public class Cliente {
public String nome;
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
}
public static alteraNome(Cliente cliente) {
cliente.setNome("Teste!");
}
public static void main(String args[]) {
Cliente cliente = new Cliente();
cliente.setNome("Novo");
alteraNome(cliente);
System.out.println(cliente.getNome()); //Imprime Teste!
}