Uso de String ou Enum

1 resposta
java
O

Olá pessoal, estou seguindo uma video-aula e o tutor coloca um código simplificado para trabalhar usando um switch case básico. O problema é que a IntelliJ tá me acusando como um erro, dizendo que não pode lidar com o termo. O código é o a seguir.

public static void changeScreen(String scr){
            switch (scr){
                case "main":
                    stage.setScene(mainScene);
                    break;
                case "details":
                    stage.setScene(datailsScene);
                    break;
            }
        }

Pelo que entendo, está completamente correto, mas ele me diz que não pode trabalhar com a variável String scr, consequentemente as outras Strings.

Tem alguma configuração ou algo mudou para que isso esteja dando errado?
O tutor citou o uso de Enum para projetos grandes, mas não tenho familiaridade e creio não ser necessário.
Se alguém puder me dizer se estou cometendo erro ou não e qual a solução para que eu não receba esses “erros” da IDE.

Desde já agradeço.

1 Resposta

peczenyj

vamos la

este codigo contem varias possibilidades.

a primeira coisa é: quando vc faz "main" ou "details" pode ficar chato vc repetir as strings por varias partes do seu codigo. imagina se vc tem 8 codigos iguais porem em um deles vc escreveu "detail" sem o s no final ? Isso é dificil de descobrir, especialmente se vc tem miopia. uma solução? criar CONSTANTES que vc declara uma vez e reusa em todo o projeto. Não tem como errar pois se vc escreve errado (o nome da variavel), não vai compilar. Se vc declarou a constante com valor errado ai é mais chato, mas vc resolve de uma vez.

Agora vamos pensar no que significa main e details. eles parecem ser valores do estado scene. pode ser qualquer valor? se não podem, pq o metodo changeScreen é que apĺica restrições?

Este é um caso onde devemos pensar: se um objeto deve ser capaz de manter o seu estado consistente, talvez este objeto possa entender o que são “main” e “details”, e porque deveria rejeitar “yolo”. O seu objeto pode ser algo extremamente simples de proposito então essa validação poderia, em tese, ser movida para outro lugar (um objeto validador, etc).

a restrição de “main” e “details” foram definidas em compile time. vc socou esse codigo ai, então vc entende esse contexto e sabe que não vai haver outros valores, então entra a ideia da enumeração.

O melhor exemplo é pensar nos dias da semana, ou meses do ano. Uma enumeração é um tipo/class especial que possui um numero finito de valores ( tal qual um boolean tem apenas true e false ).

Exemplos:

https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html

vc poderia criar uma enumeração Scene contendo MAIN e DETAILS

a partir de uma string “main” vc pode converte-la para maiuscula ( .toUpper ) e usar um Scene.valueOf( string maiuscula ) para converter a string para enumeracao ( lança exception se estiver errado ).

e nesse caso vc pode musar o setScene para recever um Scene ao inves de uma String, mudando o tipo do atributo.

e talvez vc não precise usar esta conversão se vc usar Scene.MAIN e Scene.DETAILS em todo o canto ( exceto se o usuario pode escrever isso )

Criado 30 de agosto de 2018
Ultima resposta 30 de ago. de 2018
Respostas 1
Participantes 2