【问题标题】:private abstract classes in Java [duplicate]Java中的私有抽象类[重复]
【发布时间】:2023-03-16 02:02:01
【问题描述】:

我是 Java 的新手。我最近在浏览一些 Android 应用程序源代码时遇到了一个常规类中的私有静态抽象类。这种嵌套类的用例是什么?它将如何使用以及使用这样的类有哪些设计好处?

【问题讨论】:

    标签: java class private abstract


    【解决方案1】:

    我之前从未遇到过这种模式,但我可以想象它在以下情况下很有用:

    • 您希望在一堆嵌套类中以类似的方式实现接口(例如,从封闭类中的公共方法返回)
    • 这些接口实现有很多共同的代码(因此是抽象类)
    • 除了实现之外,您不需要任何代码了解抽象类

    抽象类的子类也可能是私有的。 (通常当我编写嵌套类时,它们是私有的实现细节。)例如:

    public interface Foo {
        // Methods here
    }
    
    public class FooFactory {
    
        public static Foo getFoo1() {
            return new Foo1();
        }
    
        public static Foo getFoo2() {
            return new Foo2();
        }
    
        private static abstract class AbstractFoo implements Foo {
            // Implement methods in Foo in terms of 
            // doSomething()...
    
            // Implementation-specific method
            public abstract void doSomething();
        }
    
        private static class Foo1 extends AbstractFoo {
            public void doSomething() {
            }
        }
    
        private static class Foo2 extends AbstractFoo {
            public void doSomething() {
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      这种嵌套类的用例是什么?

      如果出现以下情况,您会使用它:

      • 您将实现许多具有通用功能的嵌套类,并且
      • 您不希望具有该功能的基类可见。

      您可能还会创建叶类finalprivate

      它将如何使用以及使用这样的类有哪些设计好处?

      见上文。基本上,您隐藏了该类,以便它不能直接在最外面的封闭类之外进行子类化。我认为这也将防止子类在最外层的封闭类之外被多态地使用。

      这不是一个常见的用例,但我想在您找到它的上下文中它是明智的。

      【讨论】:

        【解决方案3】:

        一个典型的用途是替换 C 结构的等价物 - 例如一个包含名称和值并存储在封闭类的 List 或 Map 中的小类。因为它不在编译单元之外使用,所以它可以是私有的。

        这里的静态关键字用法有点奇怪;这意味着该类与封闭类没有任何联系。

        将其抽象化是不寻常的——它表明会有具体的实现,而我从未这样做过。 YMMV...

        【讨论】:

        • 为什么名称/值对是抽象的?
        【解决方案4】:

        嵌套类的目的是将嵌套类与其周围的类清楚地分组,表明这两个类要一起使用。

        嵌套类被视为其封闭类的成员。因此,可以将嵌套类声明为 public、package(无访问修饰符)、protected 和 private(有关更多信息,请参阅访问修饰符)。 静态嵌套类

        静态嵌套类声明如下:

        public class Outer {
        
          public static class Nested {
        
          }
        
        }
        

        为了创建 Nested 的实例,您必须通过在其前面加上 Outer 类名称来引用它,如下所示:

        Outer.Nested instance = new Outer.Nested();

        静态嵌套类本质上是一个普通类,它刚刚嵌套在另一个类中。它以相同的方式与其封闭类交互。作为静态的,静态嵌套类只能通过对封闭类实例的引用来访问封闭类的实例变量。

        【讨论】:

        • 这都是很好的信息,但我认为它不能回答问题。
        猜你喜欢
        • 2011-08-24
        • 1970-01-01
        • 2022-12-04
        • 1970-01-01
        • 2018-07-11
        • 2011-07-13
        • 2015-08-01
        • 2011-12-05
        • 2011-07-02
        相关资源
        最近更新 更多