JAVA具有静态成员的嵌套类。我们怎样才能避开它?

JAVA具有静态成员的嵌套类。我们怎样才能避开它?,java,static,nested,Java,Static,Nested,我的问题是:我们知道嵌套类不能有静态成员(只有当类没有被描述为static时)。但有时我们需要它 例:我们有一个图书馆。它有很强的书籍(我们会把书看成是图书馆的不可分割的一部分,我只是猜不出另一个例子)。 在classLibrary中,我应该描述嵌套的私有类Book。嵌套,因为书只存在于库中(如我前面所述)。私密,因为我们想允许在图书馆外创作书籍。我想要一个所有图书的柜台,存放在所有的图书馆里。在一个简单的情况下,我应该有静态计数器,但在那个里我不能。我不能将Book描述为静态类,因为Book属

我的问题是:我们知道嵌套类不能有静态成员(只有当类没有被描述为static时)。但有时我们需要它

例:我们有一个图书馆。它有很强的书籍<强>(我们会把书看成是图书馆的不可分割的一部分,我只是猜不出另一个例子)。
在classLibrary中,我应该描述嵌套的私有类Book。嵌套,因为书只存在于库中(如我前面所述)。私密,因为我们想允许在图书馆外创作书籍。我想要一个所有图书的柜台,存放在所有的图书馆里。在一个简单的情况下,我应该有静态计数器,但在那个里我不能。我不能将Book描述为静态类,因为Book属于图书馆。

如果你想拥有一个所有图书馆中所有书籍的计数器,我宁愿询问每个图书馆的书籍数量,并合计数量

我认为,通过向图书馆询问它们所包含的信息,可以更好地处理这个问题。图书馆照管他们的书,责任在他们身上。在库之外维护共享状态会破坏封装(并且根据实现的不同,如果您将来选择这样做,可能会在并发更新时给您带来痛苦等)

请记住,OO的要点之一是告诉对象为您做一些事情


我不能肯定你的断言。只存在于图书馆的书。它们属于图书馆,但有点不同。您的图书可以是独立的对象(不一定是内部类),而且您的库可能应该包含一个图书工厂,该工厂创建一本引用了所属库的图书。查看以了解更多信息。

您创建嵌套类的理由没有真正意义

如果您真的希望图书只能由library访问,可以通过将其放入带有library的包中并将类声明为private来将其声明为package private

这样,只有库才能使用该类

e、 g


图书
中不能有静态成员的原因是
图书
的非静态成员。因此,
图书
类有一个隐式引用一个封闭的类实例(一个
的实例)。您有许多选择:

  • 使
    书籍
    类保持静态
  • 将静态计数器保留在库类中
  • Book
    Library
    完全分开。一个库实例可以保存一个计数器,它可以保存多少本书

  • 我个人认为3号是更好的选择。一本
    不应该被强制放在图书馆里,它也应该被允许放在
    咖啡桌上
    :P

    我能理解你提到的问题,但告诉我一件事。图书馆到书籍的映射是一对多的。一个图书馆可以有很多书,所以在我看来,如果你有一个单独的图书馆类和单独的图书类,这可以处理得更好。您可以将arrayList与Book类型的Library类关联,例如:

    类库{private ArrayList;}

    这样的事情会帮助你更好地解决这个问题。为了保持书籍的计数,有一个count类,该类将与每个书籍实例关联,就像我们将图书馆与书籍关联一样。

    Java中的嵌套(非静态)类通常是一个容易混淆的概念。我建议不要使用它们,除非您真的知道自己在做什么,并且有令人信服的需求(因为需要维护您的代码的其他人也必须理解它)。嵌套类是语言的一个黑暗角落,总是可以避免的

    通常,使类嵌套的用例是当类仅由外部类使用时。例如,
    可能有一个
    CardCatalog
    ,它位于库的内部,从不与库的用户直接交互。即使如此,如果您通过使
    CardCatalog
    成为一个静态内部类,并在其构造函数中传递
    实例,使它们之间的关系更加明确,那么通常也不会那么混乱。除此之外,它将更易于测试。

    这就是你的意思吗

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

    非静态嵌套类实际上适用于每个外部类实例只有一个嵌套类实例的情况。你的例子显然不是这样


    因此,您应该将
    Book
    转换为静态嵌套类,或者将其取出并创建一个常规类(这是更好的选择)。您可以通过将其设置为受保护或包专用(只需使用
    类书
    对其进行定义)来限制对其的访问。

    如果您的书必须属于一个库,那么在所有库中保存此书的计数器有何意义?存储在其他库中的是不同的实例,它们不能共享,因此您的计数器可以是实例field@Matthew法威尔:这是所有图书馆中所有书籍的计数,而不是所有图书馆中这本书的计数。然后它存储在图书馆中,让图书馆存储它所拥有的书籍的数量更有意义,如果有必要,这可以是总计的静态字段,也可以有一个对所有库进行总计的方法。
    class Library {
    
        private static long allBooksInAllLibraries;
    
        private class Book {
    
            private Book() {
                // this should be synchronized if threads are involved
                allBooksInAllLibraries += 1;
            }
        }
     }