Alguém sabe me dizer se todos os construtores criados em Java DEVEM ser publicos?
[DUVIDA]Construtores
11 Respostas
Post errado ;x
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
Nem todos precisam ser públicos
Se vc quiser que ninguém instâncie sua classe vc pode deixa-lo como private.
Nem todos precisam ser públicosSe 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
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.
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.
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
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…
se for private acho q nao funfa pois só a propria classe enxerga
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);
}
}
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);
}
}
Tava “inspirado” hehe…
É interessante estudar padrões de projetos: