Reforço em getters

sera q vcs podem me ajudar estudei gettes retur mas , na forma abaixo eu to com um no na cabeça um tipo de branco será q vcs poderia me explicar esse return com o .getSunimage???

public class SpriteSheet {
	Sorteio s;

	private BufferedImage spritesheet;
	// o metodo construtor vai receber as imagens da pasta ress,
	// para isso pasamos como parametro String path;
	public SpriteSheet(String path) {
		// temos que colocar em um tray e catch!
		try {
			spritesheet = ImageIO.read(getClass().getResource(path));
		} catch (IOException e) {
		
			e.printStackTrace();
		}
		
	}	
	// Metodo geter.
	public BufferedImage getSpriteSheet(int x, int y, int width, int height) {
		return spritesheet.getSubimage(x,y, width, height);
	}
}

O getSubimage() retorna um objeto do tipo BufferedImage

poderia usar o return então? returne objetoImage;

na pratica ate entendo mas a teórica não, to tendo certa dificuldade em imagens

Se esse objetoImage for do tipo BufferedImage (no caso desse método), sim.

humm to entendendo

Eu sugiro voltar alguns passos e entender o que é uma declaração de método. No caso, temos:

public BufferedImage getSpriteSheet(int x, int y, int width, int height) {
    return spritesheet.getSubimage(x,y, width, height);
}

Vamos ver apenas a primeira linha:


  /‾‾‾ modificador de acesso
  |
  |          /‾‾ Retorno do método
  |          |
public BufferedImage getSpriteSheet(int x, int y, int width, int height)
                           |         |
                           |         \__Lista de parâmetros
                           |
                           \__ Nome do método

Então temos que:

  • public é o modificador de acesso (o método pode ser acessado de qualquer lugar)
  • BufferedImage é o tipo de retorno do método. Ou seja, ele tem que retornar algum objeto cujo tipo seja BufferedImage (em algum lugar vai ter um return algumaCoisa, sendo que algumaCoisa é qualquer expressão cujo resultado é um BufferedImage)
  • getSpriteSheet é o nome do método
  • int x, int y, etc é a lista de parâmetros (no caso, são 4 números inteiros, ou seja, ao chamar o método, você terá que passar esses 4 valores para ele)

A declaração do método diz o que ele faz (recebe 4 inteiros e devolve/retorna um BufferedImage). Dentro do corpo do método, temos como ele faz isso: o que ele fez com esses 4 números que passamos? Como ele usa esses valores para construir o BufferedImage?

No caso, o “como” é simples: ele repassa os valores para spritesheet (que é um objeto do tipo BufferedImage, que por sua vez possui o método getSubimage).

Se esse BufferedImage for do AWT, dá para ver na documentação que o método getSubimage recebe 4 inteiros e retorna um BufferedImage. Por isso que ao fazer:

return spritesheet.getSubimage(x, y, width, height);

Estou dizendo: vou retornar o valor que spritesheet.getSubimage retorna (que por sinal, é um BufferedImage, o que é condizente com a assinatura do método).

Ou seja, o método getSpriteSheet retorna um BufferedImage, mas como ele faz isso? Em vez dele mesmo construir um “na mão”, ele repassa para alguém que já sabe fazer isso (no caso, o spritesheet). Então ele chama spritesheet.getSubimage, e o valor que esse método retorna é retornado diretamente.

Talvez se o método fosse assim, ficasse mais claro para você:

public BufferedImage getSpriteSheet(int x, int y, int width, int height) {
    BufferedImage subimage = spritesheet.getSubimage(x,y, width, height);
    return subimage;
}

Ou seja, ele chama spritesheet.getSubimage e pega o valor retornado por este método. Em seguida retorna este valor (já que ele é um BufferedImage, ou seja, exatamente o tipo que getSpriteSheet precisa retornar).

Mas neste caso a variável subimage não está servindo para muita coisa, então posso eliminá-la e retornar diretamente o valor retornado por spritesheet.getSubimage.


O fato do método “ser um getter” (só porque o nome começa com “get”) é circunstancial, pois o que está dito acima vale para qualquer método, independente do seu nome. Na verdade, ele nem seria um getter de fato (se considerarmos a definição “clássica” do Java Beans), mas enfim: ele é um método que retorna algo, mas em vez dele fazer tudo, ele simplesmente delega para outra classe que já sabe como fazer, e retorna o resultado desta.

Sobre getters, leitura complementar: aqui e aqui.

3 curtidas

Obrigado bem explicado.