2011-11-24 3 views
1

제 질문은 : 중첩 클래스는 정적 멤버을 가질 수 없다는 것을 알고 있습니다 (클래스가 정적으로 설명되지 않은 경우에만). 그러나 때때로 우리는 그것을 가질 필요가 있습니다.Java. 정적 멤버가있는 중첩 클래스입니다. 어떻게 우회 할 수 있습니까?

예 : 입니다. 책은 입니다.(도서관의 분리 할 수없는 부분으로 책을 고려할 것이며, 다른 예를 추측 할 수 없습니다). 클래스 라이브러리 중첩 된 개인 클래스 도서을 설명해야합니다. Book이 라이브러리에만 존재하기 때문에 중첩 됨 (앞에서 설명한대로). 우리는 도서관 외부의 창작 도서를 허용하기 때문에 비공개입니다. 나는 모든 도서관에 보관 된 모든 책을 갖고 싶다. 나는 정적 인 카운터를 가져야 만하는 단순한 상황이지만 그럴 수는 없다. 도서가 라이브러리에 속하기 때문에 책을 정적 클래스로 설명 할 수 없습니다.

+1

귀하의 도서가 단일 도서관에 속해야하는 경우,이 책의 카운터를 모든 도서관에 보관하는 시점은 무엇입니까? 다른 라이브러리에 저장된 인스턴스는 서로 다른 인스턴스이며 공유 할 수 없으므로 카운터는 인스턴스 필드가 될 수 있습니다. –

+0

@Matthew Farwell : 모든 라이브러리의 모든 책의 수이며 모든 라이브러리에서이 책의 ​​수가 아닙니다. –

+0

그런 다음 라이브러리에 저장됩니다. 라이브러리에 보유하고있는 책의 수를 저장하는 것이 더 적합합니다. 필요한 경우 전체에 대한 정적 필드가 될 수도 있고, 모든 라이브러리를 합산하는 메소드를 가질 수도 있습니다 . –

답변

1

모든 도서관에 모든 도서의 카운터를 갖고 싶다면 각 도서관에 도서 수 및 총 도서 수를 요청해야합니다.

라이브러리에 포함 된 내용에 대한 정보를 라이브러리에 요청하여 처리하는 것이 훨씬 더 효과적이라고 생각합니다. 도서관은 책을 돌본다. 책임은 책과 관련되어있다. 라이브러리 외부의 해당 공유 상태를 유지하면 캡슐화가 중단됩니다 (구현에 따라 나중에이를 수행하기로 선택한 경우 동시에 업데이트 할 때 통증을 유발할 수 있습니다).

OO의 요점 중 하나는 에게 객체에 대해 수행 할 작업이 있음을 기억하십시오.

귀하의 주장에 대해 확실하지 않습니다. 도서관에만있는 서적. 도서관에 이고 약간 다르다. 귀하의 도서는 독립형 객체 (반드시 내부 클래스는 아님) 일 수 있으며, 귀하의 도서관은 소유하고있는 도서관에 대한 참고서가있는 도서 제작소를 포함해야합니다. 자세한 내용은 Factory pattern을 확인하십시오.

1

중첩 된 클래스가있는 이유는 실제로 이해가되지 않습니다.

도서관에서 도서에만 액세스 할 수있게하려면 라이브러리가있는 패키지에 넣고 클래스를 비공개로 선언하여 패키지를 비공개로 선언 할 수 있습니다.

그런 식으로 라이브러리 만 클래스를 사용할 수 있습니다.

당신이 Book에서 정적 멤버를 가질 수 없습니다

package com.company.library; 

private class Book { 
} 
1

이유는 BookLibrary의 비 정적 멤버 것입니다. 이와 같이, Book 클래스는 암시 적으로 참조를 둘러싼 클래스 인스턴스 (Library의 인스턴스)를가집니다. 다음과 같은 옵션이 있습니다.

  1. Book 클래스를 정적으로 설정합니다.
  2. 정적 카운터를 대신 Library 클래스에 유지하십시오.
  3. BookLibrary과 완전히 다른 클래스로 지정하십시오. 라이브러리 인스턴스는 보관하는 책의 수를 유지할 수 있습니다.

저는 개인적으로 # 3이 더 좋은 옵션이라고 생각합니다. Book은 반드시 도서관에 있어야하며, CoffeeTable에서도 허용되어야합니다. : P

0

내가 언급 한 문제를 이해할 수는 있지만 나에게 뭔가 말해 준다. 도서관과 도서의 매핑은 일대일이다. 그것은 하나의 도서관이 많은 책을 가질 수 있기 때문입니다. 제 의견으로는 분리 된 도서관 클래스와 별도의 서적 클래스가있는 경우 더 잘 처리 될 수 있습니다. Book 클래스의 Library 클래스와 관련된 arrayList를 가질 수 있습니다. 예 :

클래스 라이브러리 {private ArrayList < .Books>; }

이런 종류의 문제는 더 나은 방법으로 문제를 해결하는 데 도움이됩니다. 도서 수를 유지하려면 책을 보관할 때와 같은 방법으로 각 도서 인스턴스와 관련된 카운트 수업을 받으십시오.

0

Java에서 중첩 된 클래스 (정적이 아닌 클래스)는 일반적으로 혼란스러운 개념 인 경향이 있습니다. 나는 당신이 정말로 무엇을하고 있는지 알지 못한다면 그들을 사용하지 말 것을 권한다. (당신의 코드를 유지해야하는 다른 사람들도 그것을 이해할 것이기 때문에) 확신 할 필요가있다. 중첩 클래스는 언어의 일종의 어두운 모서리입니다. 항상 피할 수 있습니다.

일반적으로 중첩 된 클래스를 만들기위한 유스 케이스는 클래스가 이고 외부 클래스가 인 경우입니다. 예를 들어 LibraryCardCatalog 일 수 있습니다.이 라이브러리는 라이브러리의 내부이며 라이브러리 사용자와 직접 상호 작용하지 않습니다. 그렇더라도, 그들 사이의 관계를 좀 더 명확하게 만들려면 CardCatalog을 정적 내부 클래스로 만들고 생성자에 Library 인스턴스를 전달하면 혼동을 덜 일으킬 수 있습니다. 그 밖의 모든 것 외에, 그것은 더 시험 할 것이다.

0

이게 무슨 뜻이야?

class Library { 

    private static long allBooksInAllLibraries; 

    private class Book { 

     private Book() { 
      // this should be synchronized if threads are involved 
      allBooksInAllLibraries += 1; 
     } 
    } 
} 
0

정적이 아닌 중첩 된 래스는 실제로 외부 클래스의 인스턴스 당 하나의 중첩 된 클래스 인스턴스 만있는 경우에 사용됩니다. 이것은 분명히 당신의 경우에는 해당되지 않습니다.

따라서 Book을 정적 중첩 클래스로 변환하거나 꺼내서 일반 클래스를 만드는 것이 좋습니다 (더 나은 옵션입니다). 보호를 설정하거나 개인 패키지로 설정하여 액세스를 제한 할 수 있습니다 (이를 class Book으로 정의).

관련 문제