当前位置: 首页 > 面试题库 >

是否需要将私有嵌套类的内部声明为私有?

鲜于勇
2023-03-14
问题内容

在我经历1000 privates 之后private,可能不需要

public class Outer {

    private static class Inner { // you may drop static
        private void innerMethod() {}
    }
}

是否有 任何情况下, 该下降privateinnerMethod()将使在差异 封装 (或 使用 例如,通过外)?还考虑思考
如果 建议将其删除或使其与编码风格保持一致?

我说 没有下降 ,但不知道真的。

编辑: 刚意识到 的方式肯定是错误的-至少对于Inner字段 -声明这些字段为私有字段,然后在外部类中使用它们-
因为这会在字节码中生成( “ synthetic” )访问器-
这是在至少肿。大-所以现在我更感兴趣的对这些声明的安全影响的帐户(Inner的领域,在使用的方法Outer)包专用(或公众@JBNizet在评论中说的)


问题答案:

答案取决于您当前使用内部类的方式。

我对内部类的哲学是减轻重构的负担。我维护内部类的封装:内部类的private方法和字段即使可以访问, 也不
能从外部类访问。因此,内部类的重点是将其范围缩小到仅包含类。这样,如果以后一个内部类可以在其他地方重用,则几乎不需要任何工作(非static内部类的工作量很小)就可以将其移动到自己的文件中。

上面的内容是否是您的样式,将影响以下丢弃或保留private周围方法/字段的原因。

删除的原因private是:

  • 外部类可以访问内部成员的私有成员和方法,这意味着此类字段/方法并未 真正 封装
  • 少打字

拒绝删除的原因private是:

  • 将内部类的方法private用作文档:外部类 不应 使用这些方法
  • 如果private保留,则将内部类提升为自己的文件变得容易得多
  • 如果private被丢弃,则public内部类和private内部类有两种样式:供程序员考虑的更多样式
  • 如果private删除并创建了内部类public,则突然,每个有权访问外部文件的人都可以访问内部类的私有数据

鉴于上述样式,我认为反对删除的理由更强。



 类似资料:
  • 问题内容: 当我拥有带有私有方法或字段的内部类时,编译器必须创建受程序包保护的合成访问器方法,以允许外部类访问那些私有元素(反之亦然)。 为了避免这种情况,我通常将所有字段和方法以及构造函数设置为受包装保护,而不是私有的。 但是类本身的可见性如何?有开销吗 与 请注意,在这两种情况下,构造函数都受到程序包保护,还是使类私有更改了? 问题答案: 您是否尝试过编译并比较字节码?这是我的结果。对于: 上

  • 我正在重构一个越来越大的android项目。运行lint使我能够在外部类和内部类之间访问JSME问题私有成员。考虑下面的例子 我得到消息了 应用问题解决方案会将源更改为 我现在有点困惑。直到现在,我还以为这个例子相当于 在这种情况下,我错了吗?还是这是棉绒的问题?

  • 约书亚·布洛赫在高效的Java中写道: 请注意,非零长度数组总是可变的,因此类具有公共静态最终数组字段或返回此类字段的访问器是错误的。如果类具有这样的字段或访问器,客户端将能够修改数组的内容。这是安全漏洞的常见来源: 请注意,许多IDE生成的访问器会返回对私有数组字段的引用,这恰恰导致了这个问题。有两种方法可以解决这个问题。您可以将公共数组设为私有,并添加公共不可变列表: 或者,可以将数组设为私有

  • 问题内容: 我想这样做,但我不能。这是我的情况和理性。我有一个用于测试用例的抽象类,该类具有一个称为test()的抽象方法。test()方法由子类定义;它应使用特定应用程序的逻辑来实现,例如。我不希望直接调用test()方法,我希望超类调用test()方法,而子类可以调用调用此方法的方法(并且还可以进行其他工作,例如设置当前例如在执行测试之前的日期时间)。示例代码: 然后扩展这个。 然后调用它。

  • 我正在尝试创建一个布局为“是”或“否”的警报对话框。我想通过单击“否”按钮而不是对话框视图来关闭该对话框。Disclose() 有错误。 这是我的密码。

  • 我想使用Powermock(基于EasyMock)模拟私有静态内部类。这不是来自生产代码,这只是一个是否可能的问题。我很确定这是一个糟糕的设计,但这是我为科学而努力的东西。 假设我们有一个具有静态私有内部类的类: IExpectationSetters中的andReturn(capture)不能应用于(java.lang.Object)  私人静态内部阶级的嘲笑甚至可能吗?我还没有在SO上找到一个