java中的子保护方法。 (想不出更好的表达方式)[重复]

Posted

技术标签:

【中文标题】java中的子保护方法。 (想不出更好的表达方式)[重复]【英文标题】:Sub-Protected Method in java. (Can't think of a better way to phrase this) [duplicate] 【发布时间】:2013-07-04 07:09:07 【问题描述】:

如何在给定的类中创建一个只能由它内部调用的方法,及其子类

例如Foo类:

public class Foo
    public Foo()

    
    ???? void bar()

    

和类 Baz,扩展 Foo:

public class Baz extends Foo
    public Baz()
        this.bar(); //valid
    

还有其他一些随机类,Qux:

public class Qux
private Baz baz = new Baz();
    public Qux()
        baz.bar(); //invalid
    

请注意,这些类中的任何一个都可以在任何包中,因此简单的“受保护”将不起作用。

如果使用关键字或类似内容无法做到这一点,我愿意接受有关如何实现类似行为的建议。

【问题讨论】:

你可以把这个类放在一个单独的包中,只包含这个类..并制作方法protected 是否可以使用 Thread.currentThread().getStackTrace()[1] 或其他方法来获取方法调用者并确保其来源有效? @user1825860 如果您想要运行时解决方案而不是编译时解决方案,那么可以尝试一些方法。 好吧伙计们,事实证明我的例子被误解了,整个问题本可以通过 protected 解决,因为我不知道它的一个特性。 【参考方案1】:

这对于访问修饰符来说是不可能的。因为在受保护的修饰符(同一个包中的子类+类)和默认修饰符(同一个包中的类)之间只有两种选择。

您可以通过将所有非子类删除到具有受保护/默认访问说明符的其他包来实现此目的的唯一方法。

【讨论】:

hmmmm... 这无济于事,这是 API 的一部分。有什么解决方法吗?【参考方案2】:

没有您可以使用的可见性级别。这些级别在 Java 中是严格嵌套的,一个级别可以访问子类但不能访问包。

在 Java 1.0 中,有一个访问级别“私有保护”可以做到这一点,后来的版本中删除了它,因为它使语言复杂化并且不是很有用:子类可能由你不知道的人创建信任,而同一包中的代码由您控制。因此,保护​​自己免受子类的侵害更为重要。

【讨论】:

【参考方案3】:

public 是唯一允许从不同包中的非扩展类调用方法的关键字。因此,如果您仍然想从公共视图中隐藏该方法并将您的类放在任何地方,您将不得不通过反射调用该方法(这很脏)。

【讨论】:

以上是关于java中的子保护方法。 (想不出更好的表达方式)[重复]的主要内容,如果未能解决你的问题,请参考以下文章

我的代码有点脏,我想不出改进它的方法,我能做些啥来获得更紧凑和更好的解决方案?

使用下拉列表中的不同值

Java - 为啥另一个包中的子级无法通过父级引用访问父级的受保护方法?

访问父级的受保护变量

返回子数组的最大和

算法谜题面试