[DUVIDA]Construtores

11 respostas
luizaguerra

Alguém sabe me dizer se todos os construtores criados em Java DEVEM ser publicos?

11 Respostas

felipebonezi

Post errado ;x

blackfalcon

felipebonezi:
public Construtor() {}// Visível em todos os cantos, não importando se tem pacotes... (default) Construtor() {} // Vísivel apenas no pacote que está inserido... protected Construtor() {} // Visível por Filhos(Herança), mesmo pacote... private Construtor() {} // Visível apenas na classe criada...

Acho que é isso, se estiver errado me corrija.
Respondendo sua pergunta: Não necessariamente, depende de como você quer que ele seja visível.
Acho que é isso… ME CORRIJAM SE ESTOU ERRADO!

Bem, acredito que esteja errado mesmo. Eu fiz o teste aqui com um private e nao funcionou:

<blockquote>Teste1.java:8: cannot find symbol

symbol  : method Teste1()

location: class Teste1

Teste1();

^

1 error</blockquote>

E sobre voce ter coloca ali que existe construtor public e padrao, isso na verdade seria um so, pois nao existe construtor sem modificador. Por padrao, ele ja é publico. Por que senao, voce nao criaria um construtor de uma classe como public, onde na verdade o que voce faz é sobrescrever o construtor padrao carregado do Object.

Sou aprendiz ainda, mas ate onde eu sei, seria assim.

Abraços

zoren

Nem todos precisam ser públicos

Se vc quiser que ninguém instâncie sua classe vc pode deixa-lo como private.

blackfalcon

zoren:
Nem todos precisam ser públicos

Se vc quiser que ninguém instâncie sua classe vc pode deixa-lo como private.

Bem, entendi o porque do erro do teste que fiz ne. rsrs

Mas, nao vejo muita função em colocar um construtor como private. Ou estou errado?

Abraços

Marky.Vasconcelos

Claro que tem… quando voce quiser criar um objeto através de um factory da propria classe voce pode utilizar esse construtor privado.

Fora mesmo privados é possivel acessar via Reflection, mas isso é outra historia.

H

Se você criar uma classe com métodos estáticos e não quiser que um monte de objetos dessa classe por aí, você faz o constructor ser private.
Aí você precisa de um método estático para criar uma instância da classe.

blackfalcon

Bem, wellington nogueira, ainda estou tentando entender cara o que voce fez no seu codigo. kkkk

Enquanto estou tentando entender, voce poderia me explicar o que é factory?

Abraços

thiagobernardo_si

Constructors can use any access modifier, including private(A private constructor means only code within the class itself can instatiate an object of that type, so if the private construtor class wants to allow an instance of the class to be used, the class must provide a static method or variable that allows access to an instance created form within the class.

EU particulamente deixo como acesso default…

Tudo depende da aplicação…

R

se for private acho q nao funfa pois só a propria classe enxerga

WellingtonRamos
HLustosa:
Se você criar uma classe com métodos estáticos e não quiser que um monte de objetos dessa classe por aí, você faz o constructor ser private. Aí você precisa de um método estático para criar uma instância da classe.
Se você têm uma classe com métodos estáticos, pra que eu precisaria criar uma instância da mesma? Uso a classe estaticamente mesmo :)

Há várias utilidades para ter um construtor privado, a maior parte delas envolve impedir que o objeto seja invocado diretamente pelo desenvolvedor (por questões de gerencia de uso da mesma) ou garantir que o mesmo tenha acesso apenas a uma interface sem conhecer qual a classe concreta que está sendo utilizada (comum em Factories) que também impede o uso de outros métodos públicos (implementados na classe concreta) que possam ser mal utilizados e causem alguma situação inesperada.

Mas todos os modificadores são válidos :)

Segue um exemplo:
package maistestes;

public abstract class Animal {
	
	//Como obter a instância
	public static Animal getInstance(String animal) {
		if("gato".equals(animal)) {
			return new Gato();
		}
		return null;
	}
	
	
	public abstract void comer();
	public abstract void enxergar();

}

class Gato extends Animal{
	
	private Olhos olhos;

	//Exemplo de contrutor padrão (default)
	Gato() {
	    olhos = Olhos.getInstance(this);
    }
	
	@Override
    public void comer() {
	    acaoComer();
    }

	public void acaoComer() {
		System.out.println(this + " comendo");
    }

	@Override
    public void enxergar() {
	    olhos.ver();
    }
	
	@Override
	public String toString() {
	    // TODO Auto-generated method stub
	    return "gato";
	}
}

class Olhos {
	
	private Animal animal;

	//Como obter a instância
	public static Olhos getInstance(Animal animal) {
		Olhos olhos = new Olhos(animal);
		return olhos;
	}
	
	//Exemplo de construtor privado
	private Olhos(Animal animal) {
		this.animal = animal;
		System.out.println("Tenho olhos de " + animal);
	}
	
	public void ver() {
		System.out.println("Eu vejo como um " + animal);
	}
}
E uso:
package otherpack;
public class Teste {
	public static void main(String[] args) {
		//Estou em outro pacote, não consigo instanciar nem gato, nem olhos
		Animal animal = Animal.getInstance("gato");
		animal.comer();
		animal.enxergar();
		
		System.exit(0);
	}
}
WellingtonRamos

Tava “inspirado” hehe…

É interessante estudar padrões de projetos:

http://www.guj.com.br/article.show.logic?id=137


Criado 10 de maio de 2010
Ultima resposta 11 de mai. de 2010
Respostas 11
Participantes 9