Sobrecarga de Método (?)

Olá, sou novo aqui no fórum, assim como em Java.

Estou com uma duvida sobre um método do qual eu passo como parâmetro o nome do atributo que quero modificar e o novo valor. O nome do atributo é String mas o novo valor pode ser String, double ou int.

public class Teste {

	private String nome;
        private String corOlhos;`
	private int quantidade;
	private double preco;
	
	public Test(String nome, int quantidade, double preco, String corOlhos){
		this.nome = nome;
		this.quantidade = quantidade;
		this.preco = preco;
                this.corOlhos = corOlhos;
	}
	
	public void setAtributo(String atributo, X valor) {	
		}
		
}

Eu pensei em fazer com switch, receber ambos como String e converter dependendo de qual case, mas queria saber se existe uma maneira mais “bonita”, porque a minha classe tem cerca de 11 atributos, e fazer 11 case’s não é tão legal e também tem a questão de quando são 2 ou mais atributos de mesmo tipo, como o nome e a corOlhos ambos String.

Obrigado desde já.

Uma classe java jamais permitirá que você tenha dois atributos com mesmo nome, independente de seu tipo. Você nunca verá isso:
public class Exemplo{ int x; String x;//Só um atributo pode ter nome x }
Já com métodos, a história é um pouco diferente.
Você pode ter métodos com mesmo nome e até mesmo com mesmo tipo de retorno, DESDE QUE jamais tenha a mesma assinatura. Como assim?
Veja o que não pode:
public class ExemploNaoPode{ public void metodo(){} public int metodo(){}//Qual dos dois a JVM vai chamar quando precisar? }
Outro exemplo:
public class ExemploNaoPode2{ public String saudacao(String nome) {} public void saudacao(String nome){}//Mesma coisa, qual chamar? }
Agora, você pode sobrecarregar métodos.
Isto é, pode criar métodos com mesmo nome, tipo de retorno igual ou diferente, mas com assinaturas distintas:
public class Sobrecarga{ public String saudacao(String nome){ return "Olá, " + nome;} public void saudacao(String nome, String msg) { System.out.println(msg + nome); } }
Note que, na classe Sobrecarga, você tem dois métodos com mesmo nome (saudacao), porém, cada um recebe um número distinto de parâmetros. Isso é sobrecarga.
Outro exemplo:
public class Sobrecarga2{ public void teste(String nome, int valor){} public void teste(String nome, String valor){} }
Perceba que a classe Sobrecarga2 tem 2 métodos com mesmo nome (teste) e com mesmo número de parâmetros (2). O que os difere é o tipo dos parâmetros.
Entendeu?
A sobrecarga de métodos permite que existam métodos com mesmo nome, desde que possuam parâmetros diferentes em número ou em tipo (isso também se aplica à ordem dos parâmetros).
Lógico que você pode receber tudo em um único método que aceite duas String, mas vai de ti fazer desta ou daquela forma.

2 curtidas

Sobrecarga e Sobrescrita são assuntos de arrancar os cabelos no começo, mas logo tudo fica mais claro. Funciona bem como o @drsmachado falou: sobrecarga acontece quando você escreve um método com mesmo nome, mas com parâmetros diferentes. Vou deixar aqui duas perguntas interessantes a respeito de sobrecarga, para que você dê uma pesquisada (se quiser).

class A {
    void A(String... params) {
        System.out.println("varargs");
    }
    void A(String params) {
        System.out.println("Single arg");
    }
    public static void main(String[] args) {
        new A().A("Hello");
    }
}

Compila? Se compila, imprime o que?


class Pai {
    static int A = 0;
}

class A extends Pai {
    A() {
    }
    static int A = 1;
    void A(String str) {
        System.out.println("str");
    }
    void A(Object obj) {
        System.out.println("obj");
    }
    public static void main(String[] args) {
        Object str = "oi";
        new A().A(str);
        System.out.println(new A().A);
        System.out.println(((Pai) new A()).A);
    }
}

Compila? Se compila, imprime o que?

1 curtida