【问题标题】:Class accessing inner class privates?类访问内部类私有?
【发布时间】:2011-02-17 07:24:31
【问题描述】:
Class Outer
{
 ...
    private class Node
    {
      private T data;
      ...

      private T getData()
      {
         return data;
      }
    }
}

如果外部类可以访问内部类私有成员,那么使用 set 和 get 方法的目的是什么?将内部类设为私有的目的是什么?包访问?

【问题讨论】:

  • 请用您使用的语言标记问题。
  • @Donal,看起来像 Java。
  • Donal,这是一个与语言无关的问题……更多的是一般的 OO 问题。
  • @Jacob:我也是这么想的,但不能排除是别的;原提问者应具体说明。
  • 这是特定于语言的。一些 OO 语言没有内部类的概念,而另一些语言对于它们可以访问或被访问的内容有不同的规则。我已经为此添加了一个 Java 标记,因为 OP 谈到了包。

标签: java oop inner-classes


【解决方案1】:

当您不希望类暴露给包内或包外的外部类时,会编写私有内部类。它们仅在外层类内部使用。

getter 和 setter 在私有类中通常没有意义,因为无论如何您都可以访问实例变量。

【讨论】:

    【解决方案2】:

    可以跳过琐碎的 getter 和 setter,但通常这些方法并不琐碎(常见的情况是“延迟加载”模式)。

    编辑添加: 延迟加载是指仅在请求数据时实例化成员。当获取数据并不总是需要并且获取成本很高时使用它。

    class a
    {
    private:
        int m_aNumber;
        bigDeal *m_pBig;
    
    public:
        a() { m_aNumber = 0; m_pBig = NULL; }
        ~a() { if (m_pBig) delete m_pBig; }
    
        // trivial
        int get_aNumber() { return m_aNumber;}
        void set_aNumber(int val) { m_aNumber = val; }
    
        // lazy load
        bigDeal *get_Big()
        {
            if (m_pBig == NULL)
            {
                // bigDeal::bigDeal() downloads data from Mars Rover
                // takes 20 minutes, costs $1.2 million dollars to run
                m_pBig = new(bigDeal); 
            }
            return m_pBig;
        }
        void set_Big(bigDeal *val)
        {
            m_pBig = val;
        }
    }
    

    【讨论】:

      【解决方案3】:

      首先,我想说像对待任何其他“外部”类一样对待内部public/protected/internal 类。意思是,使用相同的设计原则。

      至于内部类,当我使用内部 private 类时,它们通常最终只是一堆字节......这意味着它们不进行实际处理。它们只是为了让为外部类编写代码更容易。

      我并不是要您编写糟糕的代码,但是您可以在内部私有类的设计中更加松懈。作为一般规则,它们应该是简单和轻量级的......不要在内部类上过度使用 OO。此外,如果您最终不得不更改内部类中的任何内容,则只需更新外部类中的引用......这 TBH 根本不是什么大问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-04
        • 2014-08-10
        • 2013-09-20
        • 1970-01-01
        • 2010-10-03
        相关资源
        最近更新 更多