Variavel de controle numerica

Bom dia, estou fazendo um exercicio de java aonde eu controle tanto o tempo quanto a potencia de um microondas via indice numerico incrementando ou decrementando, e ai vem uma pergunta…

Eu usei static nessas variaveis

Sao 2 classes distintinas…

  • Tempo
  • Potencia

Aonde eu criei 2 classes pra cada, uma pra aumentar e outra pra diminuir…

E agora de manhã me bateu uma ideia, usar singleton ao invez de static, mas ao usar o google primeiro…

vi esse post http://www.guj.com.br/java/38669-singleton-x-metodos-estatiscos

E ai gostaria de saber é melhor usar a tal injeção de dependência do que usar static ou singleton?

Poderiam me citar exemplo dessa injeção de dependencia…

Quero apenas fazer um controle numero, de aumentar ou diminuir…

Obrigado

Por que usar static? A variável precisa ser da classe? Singleton até vá lá, pois só se pode usar o microondas 1 vez por vez (?). Injeção de dependências é, definitivamente, algo que você não precisa neste momento.

Saldações companheiro…

Injeção de dependencia é geralmente utilizado para manter o baixo acoplamento…
Principalmente entre camadas de sua aplicação…

Se você quer estudar mais sobre tal assunto pesquise por Injeção de dependencia e Inversão de controle…
Pesquise tambem o Spring Framework pois em uma de suas aplicabilidades ele cria um container e injeta as dependencias de maneira facil e eficiente…

Quanto ao seu exercicio… poste aqui os códigos…
Sem uma avaliação de contexto não da para lhe dizer qual estratégia seria melhor…

Creio que static nas variaveis não ficaria muito semantico…
pois a instancia de tais seriam compartilhadas dentre a classe…

Espero que tenha ajudado…

Att

Estou usando static pq foi no momento que pareceu mais viável…

Pq eu n quero perder o valor da variavel qunado executar novamente a chamada daquela classe

Imaginemos o seguinte…

Classe tempo

int static tempo

Classe aumentatempo

tempo++;

Classe decrementa
tempo–;

É so um esboço do que fiz…
Se quiser posto aqui as classe para ficar mais facil de entender…

Vi falando que seira um má pratica usar variavel static…pq seria tipo uma global…

Tanto faz. Contanto que vc tome cuidado com chamadas concorrentes.
Dê uma olhada em AtomicInteger: http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/atomic/AtomicInteger.html

vai um trecho do codigo…

Classe modelo da potencia

package modelo;

import java.util.EnumSet;

public class Potencia {

	private static int index = 1;

	public static int getIndex() {
		return index;
	}

	public static void setIndex(int index) {
		Potencia.index += index;
		mostrar();
	}

	public static void mostrar() {
		System.out.println("Pontência: " + Tipo_Potencia.tipo_Potencia(index));
	}
}

enum Tipo_Potencia {

	Baixa(1), Media(2), Alta(3), Máxima(4);

	private int index;

	Tipo_Potencia(int indice) {
		this.index = indice;
	}

	public static Tipo_Potencia tipo_Potencia(int index) {
		for (Tipo_Potencia tipo_potencia : EnumSet.allOf(Tipo_Potencia.class)) {
			if (tipo_potencia.index == index) {
				return tipo_potencia;
			}
		}
		return null;
	}
}

Classe de aumentar e diminuir potencia

package negocio;

import modelo.Potencia;
import controle.ExcessaoPotenciaMaxima;

public class AumentarPontencia {

	private static final int INDICE_MAXIMO = 4;

	public AumentarPontencia() throws ExcessaoPotenciaMaxima {
		aumentarPotencia();
	}

	private void aumentarPotencia() throws ExcessaoPotenciaMaxima {
		try {
			if (indiceNaoExiste()) {
				throw new ExcessaoPotenciaMaxima();
			}
			Potencia.setIndex(1);
		} catch (ExcessaoPotenciaMaxima e) {
			System.out.println(e.getMessage());
		}
	}

	private boolean indiceNaoExiste() {
		return indiceIncrementado() > INDICE_MAXIMO;
	}

	private int indiceIncrementado() {
		return Potencia.getIndex() + 1;
	}
}

package negocio;

import modelo.Potencia;
import controle.ExcessaoPotenciaBaixa;

public class DiminuirPontencia {

	private static final int INDICE_MINIMO = 1;

	public DiminuirPontencia() throws ExcessaoPotenciaBaixa {
		diminuirPotencia();
	}

	private void diminuirPotencia() throws ExcessaoPotenciaBaixa {
		try {
			if (indiceNaoExiste()) {
				throw new ExcessaoPotenciaBaixa();
			}
			Potencia.setIndex(-1);
		} catch (ExcessaoPotenciaBaixa e) {
			System.out.println(e.getMessage());
		}
	}

	private boolean indiceNaoExiste() {
		return indiceDecrementado() < INDICE_MINIMO;
	}

	private int indiceDecrementado() {
		return Potencia.getIndex() - 1;
	}
}

Bom esta ai o trecho do codigo, seria mais um exercicio daqueles pra iniciantes de criar um microondas e como estou estudnado pra melhorar o codigo tenho tentado aprender novas coisas…

Vlw

[quote=tveronezi]Tanto faz. Contanto que vc tome cuidado com chamadas concorrentes.
Dê uma olhada em AtomicInteger: http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/atomic/AtomicInteger.html[/quote]

O que seria essa “corrente”?

Vou analisar essa classe AtomicInteger

Realmente companheiro, o static esta sendo mal utilizado ai…
Todas as instancias de Potencia teriam o mesmo valor literalmente…

Outra coisa é a separação de responsabilidade…

A sua classe potencia poderia ter metodos que incrementariam ou diminuiriam a o seu respectivo valor…

Gosteu de ver a Enum…
É dificil ver alguem que conhece ela…

Porem…
Da pra melhorar bastante isto ai!!

Pesquise sobre classes Anemicas…
E tome cuidado…

Estas classes de aumentar e diminuir potencia provavelmente não deveriam estar no pacote de regra de negocio…

Pesquise sobre o MVC tbm…

Abraços…
Qualqer dúvida estou a disposição…

[quote=renanjp]Realmente companheiro, o static esta sendo mal utilizado ai…
Todas as instancias de Potencia teriam o mesmo valor literalmente…

Outra coisa é a separação de responsabilidade…

A sua classe potencia poderia ter metodos que incrementariam ou diminuiriam a o seu respectivo valor…

Gosteu de ver a Enum…
É dificil ver alguem que conhece ela…

Porem…
Da pra melhorar bastante isto ai!!

Pesquise sobre classes Anemicas…
E tome cuidado…

Estas classes de aumentar e diminuir potencia provavelmente não deveriam estar no pacote de regra de negocio…

Pesquise sobre o MVC tbm…

Abraços…
Qualqer dúvida estou a disposição…[/quote]

Cara vlw pelo enum, achei num blog e tipo eu usei…pq eu vinha usando neste caso um array de string e quando vi o uso que o autor deu pra enum achei melhor, era mais adequado ao que eu gostaria…

Sobre a classe ter metodo de incrementar e decremetar, eu transformei os metodos em classe pra ficar mais separado sabe…

A questão do pacote tenho que confessar, coloquei o nome de negocio pq n sabia que nome colocar ja que essas classes fazem parte do controle da potencia

Sobre a questao da instancia, é o seguinte…

Quero fazer assim

Quero que um objeto se criei apenas o valor vai variando entende?
Pois ele é o controle

Olha, seria realmente bom aplicar MVC, estou perguntnado isso pq uma vez postei um codigo aqui de uma agenda que fiz pra gravar em txt o que esta na colecao e me sugeriram DAO, EJB e MVC mas os exemplos que vi eram complicados pois eram com GUI e banco e sao coisas que não estudei…

Estou mais estudnado coisas ligadas a melhoria de codigo sabe…

Obrigado a todos pela ajuda

“Concorrente”. Duas threads alterando a mesma variável ao mesmo tempo. :O)

[quote=tveronezi][quote]
O que seria essa “corrente”?
[/quote]

“Concorrente”. Duas threads alterando a mesma variável ao mesmo tempo. :O)[/quote]

Ok, kkkk vou verificar relacionado a threds na questão de concorrencia e não CORRENTE, kkkkk

Obrigado

Fiz um exemplo de como ficaria…

Não fiz as exceções…
Apenas um exemplo pra você ver a estrutura…

/**
 * Modelo
 * */
public class Potencia {
	// Atributos
	private int valor;
	
	// Construtores
	public Potencia(){
		this(0);
	}
	public Potencia(int valorInicial){
		this.valor = valorInicial;
	}
	
	// Metodo de acesso Getter's and Setters
	public int getValor(){
		return this.valor;
	}
	public void setValor(int valor){
		this.valor = valor;
	}
	
	// Metodos
	public void incrementar(){
		incrementar(1);
	}
	public void incrementar(int valor){
		this.valor += valor;
	}
	
	public void decrementar(){
		decrementar(1);
	}
	public void decrementar(int valor){
		this.valor -= valor;
	}
}
/**
 * Aplicação do modelo
 * */
public class Aplicacao {
	public static void main(String[] args) {
		Potencia potencia = new Potencia();
		
		potencia.incrementar(3);
		
		System.out.println(potencia.getValor());
		
		potencia.decrementar();
		
		System.out.println(potencia.getValor());
	}
}

Percebe a diferença?
Desta maneira eu posso criar diversas potencias…

Ex… hj precizo de uma potencia para um microondas…
Eu vo la e instancio uma novinha…
se amanha eu tiver uma potencia para um carro…
eu vo la e crio outra…

do geito que vc tava fazendo
Com o atributo estático…
O valor seria igual para todas as instancias… ou seja…
se eu aumentasse a potencia do carro…
a do micro ondas tbm iria aumentar…

Atributos statics são (a grosso modo) atributos de Classe…

Se você que melhorar bastante leia a FJ11, apostila da caelum gratuita…
depois passe para a FJ21…

nas duas há muito conhecimento a ser digerido :slight_smile:

Santa mãe de Deus pessoal! O cara tá começando agora … será que pra fazer uma classe microondas o cara vai precisar de Spring + Hibernate e arquitetura multi-camadas ???

class Microondas{
   public static final int BAIXA = 1;
   public static final int MEDIA = 2;
   public static final int ALTA = 3;
   public static final int MAXIMA = 4;

   private int potencia = BAIXA;
   private int tempoEmSegundos = 0;

   public void aumentaPotencia(){
       if(potencia < MAXIMA) 
          potencia++;
   }

   public void diminuiPotencia(){
      if(potencia > BAIXA)
         potencia--;
   }

   public void aumentaTempo(int segundos){
      tempoEmSegundos += segundos;
   }

   //...
}

E por que não??

Se for a fim de estudos… tudo é possivel…

conhecimento nunca é demais…

E por que não??

Se for a fim de estudos… tudo é possivel…

conhecimento nunca é demais…
[/quote]

Conhecimento nunca é demais, mas precisa ser sólido! De nada adianta usar framework se você não conhece orientação a objetos. O resultado dessa cultura de aprender ferramenta é essa grande massa de “programadores” que copiam-colam código pronto da Internet mas não sabem a diferença entre uma pilha ou fila, ou então a diferença de uma solução recursiva x iterativa.

E na boa mesmo ? Frameworks não agregam em quase nada em termos de conhecimento. Eles nada mais são do que soluções prontas que caso não existissem, você teria que fazer na mão. E 99% dos que usam frameworks não saberiam fazer sua própria solução caso elas não existissem. E porque não sabem ? Porque depois de aprender 1 framework, ao invés de estudar os conceitos por trás desse framework partem para esudar outro e mais outro …

Enfim, eu não arredo o pé de que a pessoa tem que aprender Java em etapas adequadas: lógica de programação -> orientação a objetos -> princípios de design -> padrões de projeto. Além disso, tem a questão de conhecer pelo menos o mínimo sobre banco de dados relacionais, que é outra categoria de conhecimento que as pessoas ignoram completamente, já que o Hibernate “faz tudo”.

[quote=rmendes08]Santa mãe de Deus pessoal! O cara tá começando agora … será que pra fazer uma classe microondas o cara vai precisar de Spring + Hibernate e arquitetura multi-camadas ???

[code]
class Microondas{
public static final int BAIXA = 1;
public static final int MEDIA = 2;
public static final int ALTA = 3;
public static final int MAXIMA = 4;

private int potencia = BAIXA;
private int tempoEmSegundos = 0;

public void aumentaPotencia(){
if(potencia < MAXIMA)
potencia++;
}

public void diminuiPotencia(){
if(potencia > BAIXA)
potencia–;
}

public void aumentaTempo(int segundos){
tempoEmSegundos += segundos;
}

//…
}
[/code][/quote]

vlw pela ideia, julgado o que fiz la em cima, vc acha estar muito errado?

[quote=renanjp]Fiz um exemplo de como ficaria…

Não fiz as exceções…
Apenas um exemplo pra você ver a estrutura…

/**
 * Modelo
 * */
public class Potencia {
	// Atributos
	private int valor;
	
	// Construtores
	public Potencia(){
		this(0);
	}
	public Potencia(int valorInicial){
		this.valor = valorInicial;
	}
	
	// Metodo de acesso Getter's and Setters
	public int getValor(){
		return this.valor;
	}
	public void setValor(int valor){
		this.valor = valor;
	}
	
	// Metodos
	public void incrementar(){
		incrementar(1);
	}
	public void incrementar(int valor){
		this.valor += valor;
	}
	
	public void decrementar(){
		decrementar(1);
	}
	public void decrementar(int valor){
		this.valor -= valor;
	}
}
/**
 * Aplicação do modelo
 * */
public class Aplicacao {
	public static void main(String[] args) {
		Potencia potencia = new Potencia();
		
		potencia.incrementar(3);
		
		System.out.println(potencia.getValor());
		
		potencia.decrementar();
		
		System.out.println(potencia.getValor());
	}
}

Percebe a diferença?
Desta maneira eu posso criar diversas potencias…

Ex… hj precizo de uma potencia para um microondas…
Eu vo la e instancio uma novinha…
se amanha eu tiver uma potencia para um carro…
eu vo la e crio outra…

do geito que vc tava fazendo
Com o atributo estático…
O valor seria igual para todas as instancias… ou seja…
se eu aumentasse a potencia do carro…
a do micro ondas tbm iria aumentar…

Atributos statics são (a grosso modo) atributos de Classe…

Se você que melhorar bastante leia a FJ11, apostila da caelum gratuita…
depois passe para a FJ21…

nas duas há muito conhecimento a ser digerido :)[/quote]

cara so q tem uma coisa, eu so vou criar uma vez um microondas entende…
e nele vou ficar variando a pontencia…

ali vc passa parametro…e no caso eu n preciso…

[quote=macario1983][quote=rmendes08]Santa mãe de Deus pessoal! O cara tá começando agora … será que pra fazer uma classe microondas o cara vai precisar de Spring + Hibernate e arquitetura multi-camadas ???

[code]
class Microondas{
public static final int BAIXA = 1;
public static final int MEDIA = 2;
public static final int ALTA = 3;
public static final int MAXIMA = 4;

private int potencia = BAIXA;
private int tempoEmSegundos = 0;

public void aumentaPotencia(){
if(potencia < MAXIMA)
potencia++;
}

public void diminuiPotencia(){
if(potencia > BAIXA)
potencia–;
}

public void aumentaTempo(int segundos){
tempoEmSegundos += segundos;
}

//…
}
[/code][/quote]

vlw pela ideia, julgado o que fiz la em cima, vc acha estar muito errado?
[/quote]

Nem tanto … acho que o seu erro principal foi ter criado as classes AumentarPotencia e DiminuirPotencia, e isso te confundiu te levando a criar variáveis estáticas para fazer as coisas. Veja bem, classes servem para representar coisas: Carro, Cliente, Animal, NotaFiscal, Funcionario, etc. enquanto que ações como acelerar(), contratar(), faturar(), latir(), caminhar() são ações de objetos, e tem que ser representados como métodos dentro de uma classe entendeu ? No seu caso, aumentarPotencia() e diminuirPotencia() devem ser métodos de uma classe Microondas ou de uma classe Potencia. Você vai ver que quando você aplica esses conceitos a necessidade de variáveis estáticas diminui. Via de regra, não use variáveis estáticas. Se você ficar tentado a fazê-lo, venha no fórum e peça uma segunda opinião …

Quanto ao modelo que eu coloquei, ele pode ser refinado sim, sem problemas:

class Microondas{
   private Potencia potencia;
   private Tempo tempo;

   public void aumentarPotencia(){
       potencia.aumentarPotencia();
   }
}

o que eu fiz foi refinar o modelo aplicando um conceito chamado de composição. No modelo anterior o próprio microondas sabia como aumentar ou diminuir a potência. No segundo modelo, o microondas delega essa função para um componente interno, do qual o usuário do microondas não tem conhecimento.

[quote=rmendes08][quote=macario1983][quote=rmendes08]Santa mãe de Deus pessoal! O cara tá começando agora … será que pra fazer uma classe microondas o cara vai precisar de Spring + Hibernate e arquitetura multi-camadas ???

[code]
class Microondas{
public static final int BAIXA = 1;
public static final int MEDIA = 2;
public static final int ALTA = 3;
public static final int MAXIMA = 4;

private int potencia = BAIXA;
private int tempoEmSegundos = 0;

public void aumentaPotencia(){
if(potencia < MAXIMA)
potencia++;
}

public void diminuiPotencia(){
if(potencia > BAIXA)
potencia–;
}

public void aumentaTempo(int segundos){
tempoEmSegundos += segundos;
}

//…
}
[/code][/quote]

vlw pela ideia, julgado o que fiz la em cima, vc acha estar muito errado?
[/quote]

Nem tanto … acho que o seu erro principal foi ter criado as classes AumentarPotencia e DiminuirPotencia, e isso te confundiu te levando a criar variáveis estáticas para fazer as coisas. Veja bem, classes servem para representar coisas: Carro, Cliente, Animal, NotaFiscal, Funcionario, etc. enquanto que ações como acelerar(), contratar(), faturar(), latir(), caminhar() são ações de objetos, e tem que ser representados como métodos dentro de uma classe entendeu ? No seu caso, aumentarPotencia() e diminuirPotencia() devem ser métodos de uma classe Microondas ou de uma classe Potencia. Você vai ver que quando você aplica esses conceitos a necessidade de variáveis estáticas diminui. Via de regra, não use variáveis estáticas. Se você ficar tentado a fazê-lo, venha no fórum e peça uma segunda opinião …

Quanto ao modelo que eu coloquei, ele pode ser refinado sim, sem problemas:

class Microondas{
   private Potencia potencia;
   private Tempo tempo;

   public void aumentarPotencia(){
       potencia.aumentarPotencia();
   }
}

o que eu fiz foi refinar o modelo aplicando um conceito chamado de composição. No modelo anterior o próprio microondas sabia como aumentar ou diminuir a potência. No segundo modelo, o microondas delega essa função para um componente interno, do qual o usuário do microondas não tem conhecimento. [/quote]

hum…

realmente sobre composição eu sei algo, vc cria as classes dos objetos que compoem determinado objeto maior…

por exemplo um carro…que tem volante, freio, acelerador…

sobre eu ter quebrado os métodos em suas classes foi pensando em ficar mais descentralizado pois comecei a ler o livro do fowler sobre refatoração mas concordo totalmente quando vc diz sobre responsabilidade das classes…

exemplo: freio - freia
acelerador - acelera

o problema seria mais por conta de enxergar que por exemplo ao instanciar a classe do microondas ele so instanciar uma vez a classe potencia entre outras…

Acho que ai que esta a chave para meu entendimento basico sobre uma parcela de OO…

Acredito que eu possa extrair as classes colocando elas nos metodos e manter o enum…

Irei trabalhar aqui no codigo e qualquer duvida a mais posto aqui…

vlw

Mas você não pode fazer isso, cada microondas deve ter sua própria instância de Potencia. Imagine se o mundo real fosse assim, você ajusta a potência do seu microondas e a mudança é refletida nos microondas de todo mundo ?