0

Java의 단일 메소드에서 특정 알고리즘을 구현하고 있습니다. 이 알고리즘은 다른 곳에서는 사용되지 않는 데이터 구조가 필요하기 때문에 로컬 클래스를 사용하는 것이 적절하다고 생각합니다. 알고리즘의 마지막 단계는 메서드에서 이전에 생성 된 모든 개체를 반복해야하므로 로컬 클래스의 생성자를 새로 만든 개체를 목록에 추가한다고 생각했습니다. Java에서 로컬 클래스는 final으로 선언 된 로컬 변수에 액세스 할 수 있습니다. 분명히 내가 로컬 클래스 내에서 참조 할 수 있습니다 전에 fooList 선언해야하기 때문에Java : 로컬 클래스 내에서 참조되는 로컬 변수에 대해 매개 변수화 된 유형의 로컬 클래스 사용

public void doThing() { 

    class Foo { 
     public Foo() { 
      fooList.add(this); // FAILS: "cannot find symbol: variable fooList" 
     } 
    } 

    final ArrayList<Foo> fooList = new ArrayList<Foo>(); 

    // algorithm goes here, instantiating some Foo objects: 
    Foo foo = new Foo(); 
    // etc. 

    // now iterate through all the Foo objects that were created 
    for (Foo f : fooList) 
     System.out.println(f); 
} 

이 실패 : 그래서 나는 이런 식으로 뭔가를 시도했다. 분명히 내가 그것을 참조하기 전에 클래스 Foo 정의가 필요하기 때문에,

public void doThing() { 

    final ArrayList<Foo> fooList; // FAILS: "cannot find symbol: class Foo" 

    class Foo { 
     public Foo() { 
      fooList.add(this); 
     } 
    } 

    fooList = new ArrayList<Foo>(); 

    Foo foo = new Foo(); 
    for (Foo f : fooList) 
     System.out.println(f); 
} 

를하지만이 역시 실패 : 좋아, 좋아, 내가 생각, 난 그냥 방법의 시작 부분에 fooList를 선언 할 수 있습니다. 그렇다면이 순환 의존성을 어떻게 깨뜨릴 수 있습니까?

+0

메쏘드에 내부 클래스를 생성하고 그 클래스의리스트를 사용한다면 당신은 틀린 설계를하고있는 것입니다. 어쩌면 이것을하기 위해 외부 클래스를 추가해야 할 것입니다. 그것은 나에게 1000 라인 방법의 시작처럼 들리네 ... –

답변

0

대안 :

class Foo { 
    public Foo(ArrayList<Foo> fooList) { 
     fooList.add(this); 
    } 
    public Foo() { 
    } 
} 

public void doThing() { 
    final ArrayList<Foo> fooList = new ArrayList<Foo>(); 

    Foo foo = new Foo(fooList); 

    // or simply fooList.add(new Foo()); 


    for (Foo f : fooList) 
     System.out.println(f); 
} 

는 나는이 방법을 나열 대한 참조를 추가하는 나쁜 아이디어라고 생각합니다. 이 경우 간단하게 new Foo(fooList);을 쓸 수 있으며 참조가 목록에 있지만 사용자가 참조에 저장하지는 않습니다. 그것은 당신이 무엇을하려는 지에 따라 달라집니다, 그래서이 순환 종속성을 깰 어떻게 그래서 가장 편안한 변형

+0

당신은 생성자에 목록을 줄 수 있습니다. 아니면 doThing()에서'fooList.add (foo);'를 호출하십시오. – alaster

+0

'class'를 로컬로 만들 필요가 없습니다. 그러나 ArrayList는 unical이어야합니다. 내 대답을 편집 – alaster

+0

맞아, 나는 또한 생성자에 매개 변수로'fooList'를 전달할 수있다; 좋은 생각이야. 로컬 클래스에 액세스 할 수있는 목적은 마치 할 필요가 없도록하는 것 같지만 오히려 잘합니다. –

2

를 사용할 수 있습니까?

로컬 클래스를 개인 정적 중첩 클래스로 분리하는 것이 좋습니다. 나는 으로 보았습니다. 메서드 내에서 선언 된 명명 된 클래스를 즐겁게 사용하는 것을 보았습니다. 일반적으로 클래스를 선언 할 때까지는 "하나의 메서드에서만 사용됩니다"라는 부분에 대해 박수 갈채하는 반면 메서드는 이미 중간 길이가됩니다.

물론 선언문에 원시 형식을 사용하고 나중에 캐스팅 할 수는 있지만 ... 아마도 효과가 있지만 분명히 끔찍할 것입니다.

+0

로컬 클래스를 사용하는 것이 유용하다고 생각한 이유 중 하나는'Foo'의 메소드가'doThing()'메소드에서 네 개의 지역 변수를 사용해야한다는 것입니다 (그 중 하나는'fooList'이고, 그러나 3 개의 다른 것이있다).이 모든 네 가지 매개 변수를 필요한 모든 메서드에 매개 변수로 전달할 수는 있지만 로컬 클래스를 사용하여 그러한 circumlocution을 피할 수 있다고 생각했습니다. 그래도 아니 겠지? –

+0

@BrianKell : 당신이 당신의 방법에 너무 많은 일을 한 것처럼 들립니다. 클래스의 생성자에 전달할 수 없으며 클래스에서이를 처리 할 수있는 방법을 제공 할 수 있습니까? –

관련 문제