2017-02-17 20 views
-4

루프 내부에서 인스턴스화를 피하는 가장 좋은 해결책은 무엇입니까? CAST 우리는 코드를 점검하고 이제는 문제를 해결하지 않을 것입니다. 코드의자바의 루프 내부에서 인스턴스화 피하기

일부는

List<Long> darkList = new ArrayList<>(); 
for (Threshold thresholdObj : threshold) { 
    DarkDTO dto = new DarkDTO(); 
    dto.setID(1L); 
    darkList.add(dto); 
} 

문제는
가 어떻게 루프 내부 인스턴스화하지 않도록 방지 할 수 있습니다 DarkDTO dto = new DarkDTO(); 라인에 따라입니까? 접근 방법 (질문과 내 코드의 코드) 모두, 즉 전혀 기억 같은 일을보기의 가비지 콜렉터의 관점에서 loop.Try

 DarkDTO dto = new DarkDTO(); 
     List<Long> darkList = new ArrayList<>(); 
     for (Threshold thresholdObj : threshold) { 
     dto.setID(1L); 
     darkList.add(dto); 
     } 

내부 초기화

+5

여기서 할 수 없습니까? 해결하려는 실제 문제는 무엇입니까? 그렇지 않으면 [XY 문제] (https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) –

+0

루프 내부의 인스턴스화가 잘못된 로직을 나타내는 경우가 있지만 적용되지 않는다고 생각합니다. 귀하의 코드에. 코드를 개선 할 수있는 방법은 없습니다. 이 [질문] (http://softwareengineering.stackexchange.com/questions/167938/does-it-make-a-difference-if-i-declare-variables-inside-or-outside-a-loop)을 읽을 수도 있습니다. -in-jav)를 참조로 사용합니다. –

+0

저는 CAST가 무엇인지 모르지만 "루프 내부에서 인스턴스화를 피하십시오"라는 경고는 의미가 없습니다. 또한이 코드는 컴파일되지 않습니다. 'DarkDTO'는'Long'을 확장 할 수 없으므로'List '에 추가 할 수 없습니다. – dimo414

답변

-3

피 내 접근 할 때와 leaked.But입니다 DarkDTO dto = new DarkDTO(); 이전에 참조 된 DarkDTO()가 고아가되어 가비지 수집에 적합합니다.

차이점은 루프가 다 소모되면 DarkDTO의 마지막 인스턴스가 원래 루프 외부에서 생성 된 DarkDTO 참조를 통해 여전히 도달 할 수 있다는 것입니다. 그 코드를 제공했습니다.

또한 원래의 질문은

했다
내가 루프 내부의 인스턴스 생성을 방지 피할 수있는 방법

? 은 따라서 그것은

+3

동일한 개체 참조가 목록에 N 번 존재합니다. 즉, 하나를 편집하면 모두 바뀝니다. –

+2

이것이 좋은 생각이라고 생각하거나 OP 문제를 해결할 수있는 이유는 무엇입니까? – dimo414

+0

나는 누가 이것을 upvoted 모르지만 부끄러운 ... –

1

Threshold 개체에 대한 DarkDTO 개체가하려는 경우 당신은 피할 수없는 아주 간단한 대답했다. 인스턴스화하는 것을 피한다면 분명히 바람직하지 않은 객체를 하나 갖게됩니다. 분명히 실제 문제를 해결하기 위해 잘못된 장소를보고 있습니다.

사용중인 도구/제품이이 문제를보고했을 수 있습니다. 내가 너라면 나는 단지 당신이 dto 객체를 확실히 알고 있기 때문에 그 소프트웨어를 사용하거나 건너 뛰기 만하면된다.

-3

Java8에서 forEach 작업을 사용할 수 있습니다. 그러나 그것은 절대적으로 같은 효과이며 루프에서 객체 인스턴스화를 피하려는 이유를 알지 못합니다.

final List<Long> darkList = new ArrayList<>(); 
threshold.forEach(threshold->{ 
    DarkDTO dto = new DarkDTO(); 
    dto.setID(1L); 
    darkList.add(dto); 
}); 
+1

매번 새로운 인스턴스를 생성하지 않습니까? –

+1

같은 일을하는 것은 대답이 아닙니다 :) –

+1

예, 물론 그렇습니다. 하지만 루프가 아니므로 CAST가 확인하지 않습니다. D "루프 내부의 인스턴스화를 피할 수있는 방법은 무엇입니까?" => 루프를 교환하십시오. 루프에서 인스턴스화 검사 코드를 작성하는 것이 의미가 없기 때문에 "CAST"를 트릭하는 방법을 제공했습니다. –

관련 문제