Como sempre mudar o estado da lâmpada?

20 respostas Resolvido
java
1

Galera, boa noite.

Gostaria da ajuda de vocês para tentar mudar algumas coisas nesse código.

Estou tentando fazer esse exercício de Java

  1. Escreva uma classe para representar uma lâmpada. Desenvolva
    métodos para ligar, desligar a lâmpada.

Main.java

public class Main {
public static void main(String[] args){
	
//cria o objeto lampada
Lampada estadoLampada = new Lampada();

    //ligar a lampada
    estadoLampada.setEstado(true);
    System.out.println("Lampada ligada.");

    //desliga a lampada
    estadoLampada.setEstado(false);
    System.out.println("Lampada desligada.");
   }
 }

Quando compilo o programa Main.java com javac Main.java aparece Main.class


Lampada.java

public class Lampada {
private boolean estado; //ligado ou não

public Lampada(){
    //a lampada comeca desligada
    this.estado = false;
}

//metodo que seta o estado da lampada
public void setEstado(boolean estado){
    this.estado = estado;
}

     //metodo que retorna o estado atual da lampada
      public boolean getEstado(){
        return this.estado;
    }
 }

Quando compilo o programa Lampada.java com javac Lampada.java aparece Main.class


Mas, quando o programa é executado com java Main.java. Mostra como resultado:

  • Lampada ligada, Lampada desligada.

Gostaria que quando o programa for executado com java Main.java

Mostrar de forma automática os estados:

  • Lampada ligada, Lampada desligada, Lampada desligada, Lampada ligada…

20 Respostas

I

Basta fazer um teste (if) de estado atual e inverter (usar o operador negação !).

1

Algo como

public class Lampada {

//a lampada comeca desligada
public Lampada(){ this.estado = false; }

//metodo que seta o estado da lampada
public void setEstado(boolean estado){ this.estado = estado; }

//metodo que retorna o estado atual da lampada
public boolean getEstado(){ return this.estado; }

//ligado ou não
public boolean estado(Object mostrarestado){ 

    //a lampada comeca desligada
    if ( this.estado == mostrarestado)
        return false;

    //metodo que seta o estado da lampada
    if (mostrarestado == true)
        return true;

    //metodo que retorna o estado atual da lampada
    if (setEstado() != mostrarestado.setEstado())
        return true;

    // Check os valores
  } 

 }

?

I

Na verdade, na minha resposta anterior, eu falei bobagem. Prestando mais atenção à sua questão percebi a execução do mesmo arquivo e não de arquivos diferentes à cada chamada da JVM. A única forma de modificar as propriedades de um objeto é recompilando-o com um novo estado (definindo novos valores iniciais no código-fonte) - o que não é nada produtivo (exceto em cados de correção do código-fonte) - ou, em tempo de execução passando parâmetros para a interface pública do objeto (um método público de configuração, ou seja, um método setter conveniente). Nesse caso, as modificações ocorrem em tempo de execução. Como se chama a JVM a cada momento, o estado do objeto é redefinido para o estado inicial (conforme o determinado no código-fonte). Logo, qualquer alteração no estado do objeto não será mantida. Com efeito, assumindo que eu esteja certo, não há como fazer essas atualizações de estado do objeto lampada à cada chamada da JVM. O certo seria manter o programa rodando e alterar o estado do objeto pelo método setEstado(). Caso alguém saiba uma forma de contornar isso, ou, explicar de forma alternativa, caso eu esteja errado, por favor, não me deixe expor informações erradas impune.

1

Como posso contornar esse problema? Gostaria de chamar um “printf” cada vez que o a linha

java Main.java

for chamada.

Exemplo,

java Main.java

  • System.out.println(“Lampada desligada.”);

java Main.java

  • System.out.println(“Lampada ligada.”);
I

Fases de um programa Java:

1 - Edição/Codificação (implementação do algoritmo segundo a sintaxe a semântica do Java) - o programador cria um ou mais arquivos de extensão .java;
2 - Compilação - o compilador do Java transforma o arquivo .java em .class convertendo as declarações e expressões do código-fonte em código bytecode. Isso acontece com a invocação do compilador Java por meio do comando javac;
3 - Carga - o carregador Java lê os arquivos de bytecodes (.class) e os carrega na memória principal do computador (RAM);
4 - Verificação - verifica a validade dos bytecodes carregados;
5 - Execução - transforma os bytecodes em linguagem de máquina sob demanda, ou seja, à medida que é preciso (JIT). Isso é feito pela Máquina Virtual do Java (JVM) por meio do comando java.

Logo, quando tu chama a JVM, a compilação já foi feita. Chamadas sucessivas não irão alterar o estado inicial do objeto, seja ele do tipo Main ou Lampada a menos que tu mande uma mensagem para redefinir o estado, ou seja, que você passe parâmetros de configuração das propriedades (atributos) do objeto - use um método setter conveniente.

Obs.: o certo é java Main, sem a extensão .java para chamar a JVM.

1

Como posso mandar uma mensagem para redefinir o estado, ou seja, que passe parâmetros de configuração das propriedades (atributos) do objeto - use um método setter conveniente?:smiley:

I
Solucao aceita

Creio que não me fiz entender. Tu compila o código (javac -encoding UTF-8 Main.java); depois tu chama a JVM (java Main). Nesse caso, tu pode solicitar que o usuário ligue ou desligue a lâmpada.

Exemplo:

public class Lampada {
	private boolean ligada = false;
	
	/*
	* Métodos acessores e modificadores
	*/
	public void setLigada(boolean alteraEstado){
		if(isLigada() != alteraEstado)
			this.ligada = alteraEstado;
	}
	
	public boolean isLigada(){
		return ligada;
	}
}

import java.util.Scanner;

public class Main {
	public static void main(String[] args){
		char opcao = 's';
		Scanner leitor = new Scanner(System.in);
		Lampada lampada = new Lampada();
		
		System.out.print("Ligar a lâmpada?[S/N]: ");
		opcao = leitor.next().charAt(0);
		
		if(opcao == 's' || opcao == 'S')
			lampada.setLigada(true);
		
		else if(opcao == 'n' || opcao == 'N')
			lampada.setLigada(false);
		
		
		if(lampada.isLigada())
			System.out.println("\nLigando a lâmpada...");
		
		else
			System.out.println("\nDesligando a lâmpada...");
	}
}

Rodando…

image

1

Valeu pela resposta.

1

deu erro :face_with_raised_eyebrow:

Main.java:15: error: not a statement

I

Na compilação ou na execução?

1

Compilação

1

É possível usar String em vez de, char? :face_with_raised_eyebrow:

I

Então tu está fazendo alguma coisa errada. Sobre usar String em vez de char, sem problema, desde que, evidentemente, tu faça as adaptações necessárias.

1

Estou tentando e pensando em uma solução diferente

import java.util.Scanner;
  
    public class Main {
    public static void main(String[] args){
    
    String comando = "ligar";
    Scanner sc = new Scanner(System.in);

    Lampada lampada = new Lampada();
    int estadoAtual; 

    System.out.print("Use o comando 'ligar' para ( ligar a lampada ) ou 'desligar' para ( desligar a lampada).");
    comando = sc.nextInt();
		
    switch (estadoAtual) {

		case 1:
		comando == "ligar"
		if(lampada.isLigada())
        if(comando.equals("ligar"))
		System.out.println("lampada ligada.");           
		lampada.setLigada(true);           
		break;

		case 2:
        comando == "desligar"
        if(comando.equals("desligar"))
        if(lampada.isDesligada())
        System.out.println("lampada desligada.");           
		lampada.setLigada(false);           
		break;

		default:
		System.out.println("lampada desligada.");
	    lampada.setLigada(false);           

      }
	}
}
I

Se são Strings, é mais interessante usar o método equals() para fazer as comparações, como por exemplo: if(comando.equals("ligar")). O erro persiste?

1

Valeu pelas informações.

1

Esse shell é do Windows?

I

Não (Cmder console emulator).

1

Poderia dizer antes de acessar esse link se esse software é gratuito ou pago ou se esse software aberto ou é fechado? :smiley:

1

Fiz deste modo

import java.util.Scanner;
public class Main {
public static void main(String[] args){

String comando = "ligar";
Scanner sc = new Scanner(System.in);

Lampada lampada = new Lampada();
int estadoAtual; 

System.out.println("\n\n\nUse o comando 'ligar' para ( ligar a lampada ) ou 'desligar' para ( desligar a lampada).\n\n\n");
comando = sc.nextLine();
	
switch (comando) {

	case "ligar": 
	
    if(comando.equals("\n\n\n ligar"))
	// if(lampada.isLigada())
	System.out.println("\n\n\n lampada ligada.");           
	lampada.setLigada(true);           
	
	break;

	case "desligar": 
    
    if(comando.equals("\n\n\n desligar"))
    // if(lampada.isDesligada())
    System.out.println("\n\n\n lampada desligada.");           
	lampada.setLigada(true);           
	
	break;

	default:
	System.out.println("lampada desligada.");
    lampada.setLigada(false);  
}
}
}

O que você acha? Estou tentando ser criativo, original :smiley:

Criado 13 de outubro de 2019
Ultima resposta 14 de out. de 2019
Respostas 20
Participantes 2