SingleTon - HELP

Pessoal, boa tarde, estou desenvolvendo um trabalho na faculdade
e quase na parte final dei uma empacada
e estou precisando de uma ajudinha do pessoal

"6. Crie, dentro do pacote controladores, uma classe chamada ControladorPrincipal. Essa classe deverá ter as seguintes características:

a. Deverá ser um singleton
b. Deverá ter um método que receba os dados da tela de cadastro de produto, para efetuar esse cadastro."

ja fiz todo o meu sistema
tenhu uma tela de cadastro de produtos e tudo o mais

agora, sei que SingleTon vc tem uma classe onde c instancia ela apenas uma vez
ja li os posts antigos aqui e li tb sobre singleton na wikipedia
mas ainda continuo perdido

seria mais ou menos isso?

public class ControladorPrincipal 
{
	private static  Produtos novoProduto = new Produtos();
	
	public ControladorPrincipal()
	{
		
	}
	
	public static Produtos getNovoProduto()
	{
		if (novoProduto == null)
		{
			novoProduto = new Produtos();
		}
		
		return novoProduto;
		
	}

}

[code]
public class Exemplo {
private static Exemplo singleton;

private Exemplo() {		
}

public static Exemplo getInstance(){
	if(singleton == null){
		singleton = new Exemplo();
	}
	return singleton;
}

}[/code]
Flw

Não, é quase isso.
Basicamente:

[code]public class ControladorPrincipal {
private static final ControladorPrincipal cp;

private ControladorPrincipal(){}

public static synchronized ControladorPrincipal getInstance() {
    if(null == cp) {
        cp = new ControladorPrincipal;
    }
     return cp;
}

}[/code]

[quote=nel]Não, é quase isso.
Basicamente:

[code]public class ControladorPrincipal {
private static final ControladorPrincipal cp;

public static synchronized ControladorPrincipal getInstance() {
    if(null == cp) {
        cp = new ControladorPrincipal;
    }
     return cp;
}

}[/code][/quote]

Neste caso se não tiver o construtor “private” … é possivel criar uma nova instancia da classe.

[code]public class ControladorPrincipal {

private ControladorPrincipal (){}
private static final ControladorPrincipal cp;

public static synchronized ControladorPrincipal getInstance() {
    if(null == cp) {
        cp = new ControladorPrincipal;
    }
     return cp;
}

}[/code][/

[quote=jilles]Pessoal, boa tarde, estou desenvolvendo um trabalho na faculdade
e quase na parte final dei uma empacada
e estou precisando de uma ajudinha do pessoal

"6. Crie, dentro do pacote controladores, uma classe chamada ControladorPrincipal. Essa classe deverá ter as seguintes características:

a. Deverá ser um singleton
b. Deverá ter um método que receba os dados da tela de cadastro de produto, para efetuar esse cadastro."

ja fiz todo o meu sistema
tenhu uma tela de cadastro de produtos e tudo o mais

agora, sei que SingleTon vc tem uma classe onde c instancia ela apenas uma vez
ja li os posts antigos aqui e li tb sobre singleton na wikipedia
mas ainda continuo perdido

seria mais ou menos isso?

public class ControladorPrincipal 
{
	private static  Produtos novoProduto = new Produtos();
	
	public ControladorPrincipal()
	{
		
	}
	
	public static Produtos getNovoProduto()
	{
		if (novoProduto == null)
		{
			novoProduto = new Produtos();
		}
		
		return novoProduto;
		
	}

}

[/quote]

Boa tarde.
olhando o código postado (fora o fato de não “entrar” no if por que tu já instanciaste a variável), pode ser considerado um singleton, mas acredito que não eh o que tu precisa.

segue:

a classe que deve ser o singleton é teu controlador e não teu produto, imagine a situação… vais salvar enumeros produtos diferentes, o produto pode ser qualquer coisa… mais a forma de salvar vai ser sempre a mesma… compreende?

então quem deveria ser instaciado apenas uma vez e funcionaria sempre… seria teu controlador concorda?

[quote=diego.sas][quote=nel]Não, é quase isso.
Basicamente:

[code]public class ControladorPrincipal {
private static final ControladorPrincipal cp;

public static synchronized ControladorPrincipal getInstance() {
    if(null == cp) {
        cp = new ControladorPrincipal;
    }
     return cp;
}

}[/code][/quote]

Neste caso se não tiver o construtor “private” … é possivel criar uma nova instancia da classe.

[code]public class ControladorPrincipal {

private ControladorPrincipal (){}
private static final ControladorPrincipal cp;

public static synchronized ControladorPrincipal getInstance() {
    if(null == cp) {
        cp = new ControladorPrincipal;
    }
     return cp;
}

}[/code][/[/quote]

Observação correta. Já editei :slight_smile:

[quote=diego.sas][quote=nel]Não, é quase isso.
Basicamente:

[code]public class ControladorPrincipal {
private static final ControladorPrincipal cp;

public static synchronized ControladorPrincipal getInstance() {
    if(null == cp) {
        cp = new ControladorPrincipal;
    }
     return cp;
}

}[/code][/quote]

Neste caso se não tiver o construtor “private” … é possivel criar uma nova instancia da classe.

[code]public class ControladorPrincipal {

private ControladorPrincipal (){}
private static final ControladorPrincipal cp;

public static synchronized ControladorPrincipal getInstance() {
    if(null == cp) {
        cp = new ControladorPrincipal;
    }
     return cp;
}

}[/code][/[/quote]

ahh entendi
estou comecando a entender…

public static synchronized para que seriviria esse synchronized?
e exatamente o que esta acontecendo nessa parte do codigo getInstance()
ele seria a unica instanciacao da classe?

[quote=jilles][quote=diego.sas][quote=nel]Não, é quase isso.
Basicamente:

[code]public class ControladorPrincipal {
private static final ControladorPrincipal cp;

public static synchronized ControladorPrincipal getInstance() {
    if(null == cp) {
        cp = new ControladorPrincipal;
    }
     return cp;
}

}[/code][/quote]

Neste caso se não tiver o construtor “private” … é possivel criar uma nova instancia da classe.

[code]public class ControladorPrincipal {

private ControladorPrincipal (){}
private static final ControladorPrincipal cp;

public static synchronized ControladorPrincipal getInstance() {
    if(null == cp) {
        cp = new ControladorPrincipal;
    }
     return cp;
}

}[/code][/[/quote]

ahh entendi
estou comecando a entender…

public static synchronized para que seriviria esse synchronized?
e exatamente o que esta acontecendo nessa parte do codigo getInstance()
ele seria a unica instanciacao da classe?
[/quote]

O synchronized indica que o seu método podera ser acessado exclusivamente por uma Thread de cada vez.
Por menores que possam ser as chances de duas Threads acessarem o seu método, isso pode vir a ocorrer e gerar duas instancias, por isso o modificar synchronized.

Toda, ele deixa o seu código menos perfomático e etc e isso já foi bastante discutido em todo o mundo Java, basta procurar na net ou , se preferir, aqui no GUJ mesmo :slight_smile: