【问题标题】:public access methods inside a default access class.. what is the point?默认访问类中的公共访问方法..有什么意义?
【发布时间】:2014-09-21 14:21:53
【问题描述】:

如果你将一个类设为默认访问,并将该类中包含的方法标记为 public,这意味着什么?换句话说,如果封闭类不能公开访问,你怎么能公开访问方法呢?

【问题讨论】:

  • 可能通过abstract factory pattern 或builder pattern 用于创建实例。
  • 低质量问题:docs
  • @afzalex,请不要在回答问题之前发表诸如“低质量问题”之类的无端言论。看看其他帖子,人们实际上给出了有意义的答案。

标签: java access-modifiers


【解决方案1】:

在某些情况下可能需要公开方法,例如,当您的具有默认访问权限的类实现公共接口时。

当您的 API 是根据接口定义的并且您的默认访问类实现这些公共接口之一时,这很有用。您的 API 用户可以通过工厂方法实例化您的默认访问类。

【讨论】:

  • 您指出了一件非常有趣的事情。我没有想到。谢谢。
  • 还有一个问题.. 这是唯一在默认访问类中声明公共方法有意义的情况吗?
  • @user3516726 这是最常见的情况,也是唯一严格要求的情况(我也算在这一类别中实现公共抽象类和非抽象类)。其他情况并不严格要求公共方法,但您可以选择这样做,以向在您之后维护您的代码的人强调这些方法旨在供有权访问此类的任何人使用。
  • 谢谢。这澄清了它。
【解决方案2】:

当你重写一些公共方法或实现interfaces时,经常需要public。
让我们以 Object#equals 方法的简单示例为例。

虽然您的主类将具有默认范围,但您不能在降低可见性的同时覆盖该方法。 所以你需要:public void equals(.......

【讨论】:

    【解决方案3】:

    你的意思是这样的:

    package p1;
    class C1 {
        public void publicMethod() {}
    }
    

    在另一个包中:

    package p2;
    import p1.C1; // not allowed
    public class C2 {
        C1 c1; // not allowed
        void test() {
            c1.publicMethod(); // not allowed
        }
    }
    

    在继承的情况下,可以使用publicMethod:

    package p1;
    public class C2 extends C1 {}
    

    现在publicMethod可以访问了:

    package p2;
    import p1.C2; // C2 is public, ok !
    public class C3 {
        C2 c2;  // C2 is public, ok !
        void test() {
            c2.publicMethod(); // C2 is public, use publicMethod of C1 !
        }
    }
    

    因此,减少 class 的可见性对于不应该直接在包外使用的抽象类很有用。

    【讨论】:

    • 你说过'在继承的情况下可以使用 publicMethod'。但是,如果该类被声明为默认访问,则在包外无法访问其中的任何方法(甚至是公共的)。事实上,在包之外,你甚至不能对具有默认访问权限的类进行子类化。
    • p1.C2(公共)扩展 p1.C1(默认)。 p1.C2 实例可以访问任何包中 p1.C1 的公共方法。自己试试吧。
    • 我觉得有些误会。我要说的是,只能从包内部调用默认访问方法,而不能从外部调用。如果你有一个“受保护”的访问方法,那么子类甚至可以从包外部调用它。
    • @user3516726 我同意,只有包类可以访问方法的默认访问权限。当前的问题是“类的默认访问,而不是方法的默认访问”。
    • 如果一个类有默认访问权限: 1. 你不能从另一个包中实例化它。所以它的实例方法在它的包之外都不可用。 2. 它的静态方法都不能从另一个包中调用。对吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-04
    • 1970-01-01
    • 1970-01-01
    • 2011-10-11
    • 1970-01-01
    • 2011-02-11
    • 1970-01-01
    相关资源
    最近更新 更多