Enclosing Scope Variable - Java SE

Olá! Estou desenvolvendo uma pequena interface de cadastro de armazens, entretanto ao utilizar stream para buscar um ID informado pelo cliente, a variavel idEstoque apresenta erro de escopo. Segue abaixo o código:

    public interface IestoqueViewCadastroArmazem {

public static void run() {

String idEstoque = null;

	while (true) {
		ArmazemBuilder armazem = new Armazem.ArmazemBuilder();
		System.out.println("Por favor, digite o nome do novo armazem:\n");
		System.out.print("->  ");
		
		armazem.armazem_Nome(Iscanner.nextLine()).build();
		
		if (!armazem.build().getArmazem_Nome().isEmpty()) {
			
			Estoque estoque = new Estoque();
			List<Estoque> estoqueList = EstoqueRules.listarRule(estoque);
			if (estoqueList.size() > 0) {
				while (true) {
					idEstoque = "";
					System.out
							.println("Por favor, digite a id de um estoque para este armazem, "
									+ "deixe em branco para nenhum ou digite "
									+ "LISTARESTOQUE para listar os estoques disponíveis:\n");
					System.out.print("->  ");

idEstoque = Iscanner.nextLine();

Boolean boo = estoqueList.stream()
.anyMatch(p -> p.getId() == Integer.parseInt(idEstoque));

    if (boo == true) {
						armazem.estoque(Integer.parseInt(idEstoque));
						break;
					} else if (idEstoque.equalsIgnoreCase("LISTARESTOQUE")) {
						IimprimeListaConsole.imprimeListaConsole(estoqueList);
					} else if (idEstoque.isEmpty()) {
						break;
					}
				}
			} else {
				ArmazemRules.cadastrarRule(armazem.build());
				break;
			}
			break;
		} else {
			System.out.println("Campo em branco! digite o nome do armazem!");
		}
	}
}

}

Segue abaixo o erro:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
Local variable idEstoque defined in an enclosing scope must be final or effectively final

at viewTest.estoqueView.interfacesAction.IestoqueViewCadastroArmazem.<clinit>(IestoqueViewCadastroArmazem.java:36)
at viewTest.estoqueView.IestoqueViewArmazem.menuEstoqueViewArmazem(IestoqueViewArmazem.java:17)
at viewTest.estoqueView.IestoqueView.menuEstoqueView(IestoqueView.java:22)
at viewTest.Main.main(Main.java:72)

Custo a acreditar que precisarei fazer um for para verificar o atributo de cada objeto da lista. Alguma luz?

Agradeço desde já.

Não dá pra testar seu código pois há arquivos faltando na postagem.

Só uma pergunta:
Por qual razão você está implementando seu sistema utilizando métodos estáticos em interfaces?

1 curtida

Código tá postado errado.

Porém, você está utilizando lambda e deve atentar-se para as variáveis fora do escopo que devem ser declaradas final.

Você deve utilizar o conceito effectively final para resolver esta questão.

Aqui um exemplo onde com 4 saídas para solucionar isto.

Corrija o seu código postado aqui para que possa ser melhor avaliado.

Ao invés de declarar idEstoque logo no inicio do método, tente declará-la apenas no momento em que ela é realmente útil, ou seja, na parte em que vc pede pro usuário digitar o id.

Delete as linhas:

String idEstoque = null;

e

idEstoque = "";

E substitua

idEstoque = Scanner.nextLine();

por

String idEstoque = Scanner.nextLine();
1 curtida

Consegui resolver o problema. Precisei entender o conceito de effectively final. Estava tentando usar o ParseInt dentro do lambda, o que não é possível devido não ser possível modificar uma variavel local dentro de uma classe anônima. Utilizei método estático para dar corpo a interface. Tive uma batalha de consciencia para usar classe em vez de interface, mas dessa forma achei melhor. Sugere outra abordagem?

Essa interface é chamada por outra interface com método estático chamada IestoqueViewArmazem que possui um menu de opções. Estaria eu montando o corpo do programa errado?

2 curtidas

É que interfaces deveriam apenas estabelecer um contrato para o comportamento dos objetos.
Mas me parece que você está implementado a lógica do sistema nesses métodos estáticos.
Sem contar que interfaces são tipos abstratos de dados e você as está utilizando para dar corpo ao sistema, corpo é algo concreto, não abstrato.