Java

[Java] lambda 에러 : Local variable doesntExistFlag defined in an enclosing scope must be final or effectively final

빡새 2022. 4. 18. 00:03


장바구니 기능을 구현하고 있었다.
사용자는 세 가지 항목을 선택할 수 있었다.
주문할 상품과, 주문 갯수와, 배송 받을 날짜다.

같은 사용자가 같은 상푸믈 같은 배송 날짜로 선택하여
장바구니에 넣을 경우에는 테이블에 새로운 항목이 생기지 않는다.
대신 기존에 있던 항목에서 주문 갯수만 늘리기로 한다.

화면 처리를 위해 경우의 수를 세 가지로 나누었다.
첫째, 사용자 정보와 주문할 상품과 배송 받을 날짜가 모두 같은 경우다.
둘째, 사용자 정보와 주문할 상품은 같지만 배송 받을 날짜는 다른 경우다.
셋째, 사용자 정보만 같고, 주문할 상품과 배송 받을 날짜는 다른 경우다.

일단 화면으로부터 사용자가 선택한 정보들을 받아온다.
그리고 사용자가 장바구니에 추가했던 목록을 모두 불러와서
같은 내용이 있는지 비교한다.
기존에 있던 항목들을 하나씩 꺼내와서 새로 넣으려는 데이터와 비교한다.

상위 flag와 하위 flag를 둔다.
하위 flag는 항목 하나당 비교하는 단위고,
상위 flag는 기존에 있던 모든 항목과 
새로 넣으려는 데이터를 비교하는 단위다.



public Integer checkCartItem(ShoppingCartItemDTO param) {
    boolean doesntExistFlag = false;
    boolean salesExistDateDiffrentFlag = false;
    boolean alreadyExistFlag = false;
    ArrayList<ShoppingCartItemDTO> itemList = pdao.getCartItems(param);

    itemList.forEach((item)->{
        boolean isId = param.getLoginID().equals(item.getLoginID());
        boolean isSalesId = param.getSales_id() == item.getSales_id();
        boolean isDate = param.getWanted_date().equals(item.getWanteddate());
        if(!isId && !isSalesId && !isDate) {
        	doesntExistFlag = true;
        } else if (isId && !isSalesId && !isDate) {
        	doesntExistFlag = true;
        } else if (isId && isSalesId && !isDate) {
        	salesExistDateDiffrentFlag = true;
        } else if (isId && isSalesId && isDate) {
        	alreadyExistFlag = true;
        } 
    });

    if(alreadyExistFlag) {
    	return 1;
    } else if(salesExistDateDiffrentFlag) {
    	return 0;
    } else {
    	return -1;
    }
}



여기서 에러가 발생했다.
로직과 관련된 에러라기보다는,
문법에 관련된 에러였다.

//error
Local variable doesntExistFlag defined in an enclosing scope must be final or effectively final




항목을 하나씩 꺼내올 때 람다 표현식을 썼는데,
변수의 스코프 범위가 잘못 됐었다.
forEach에서 람다 표현식을 쓸 때는
변수는 class 변수까지 올려야 했다.
수정 후에 잘 작동했다.


-220414

반응형