【问题标题】:Declare Class Attribute Protected or Public?声明类属性受保护还是公共?
【发布时间】:2011-10-11 13:50:06
【问题描述】:

我在包 com.practise.mypackageone.MyClass 中有一个班级

类 MyClass 有一个方法

 /* Modifier  */ void show()
{
 // some code here
}

我希望这个方法只能从另一个包类访问,比如说

com.practise.mypackagesecond.SecondClass

现在,如果我将方法公开,它可以在我不想要的任何地方访问。 如果我将其设为受保护,则 SecondClass 必须扩展 MyClass 才能访问它。

但是任何其他包类也可以扩展我的类来访问该方法。

我怎样才能防止这种情况发生?

【问题讨论】:

  • 不可能......................

标签: java android oop class-design


【解决方案1】:

将类放在同一个包中,并将方法包设为私有(默认修饰符)。否则我认为你想要的是无法实现的。

【讨论】:

  • @peter 谢谢你的回复..我知道默认修饰符..问题是让它可用于其他特定的包。例如,我正在开发一个由几个包本身组成的库。不应允许将使用该库的客户端代码使用我的库包允许使用的某些特定方法。
  • 这是不可能的。唯一的解决方案是我在回答中写的,但是这些类必须在同一个包中。
【解决方案2】:

第一个包中的类可以从第二个包中扩展一个类,如下所示,它们可以根据需要实现 show() 方法:

    public static abstract class Showable {
        abstract protected void show();
    }

如果第二个包中只有一个类(例如 ViewManager)需要调用此方法,您可能希望将这个 Showable 嵌入其中,以便只有该类可以调用 show() 方法。

虽然这不是一个非常干净的设计。

【讨论】:

  • 即使第一类扩展了它并提供了一个特定的主体。即使这样,其他类也可以扩展第一个类,并且仍然可以访问该方法。
  • 还有其他方法可以防止这种情况。将您的类设为最终类,或将构造函数设为“包私有”并使用工厂对其进行实例化。
  • 如果类被声明为final,那么如果声明为protected,则没有其他包类可以访问该方法..hmmm
  • @Javanator 我们在这里将不同的东西混合在一起。第一个问题是将方法公开给特定的包/类。问题 2 是通过扩展类来避免访问受保护的方法。
猜你喜欢
  • 2012-09-09
  • 1970-01-01
  • 2011-05-29
  • 2015-12-29
  • 1970-01-01
  • 2012-02-13
  • 2018-05-07
  • 2013-08-14
相关资源
最近更新 更多