【问题标题】:Java, prevent class from calling a public method [duplicate]Java,防止类调用公共方法[重复]
【发布时间】:2017-02-27 00:04:15
【问题描述】:

对于一项任务,我必须为“状态”类编写代码,该类具有有关飞机位置的所有属性。

Javadoc 已经编写好,必须严格遵守。所有 set 方法都是公共的,但如果 Airplane 以外的任何类尝试使用它们,则必须抛出异常。

我根本无法更改任一类的结构或可见性。我的教授说要以某种方式使用“克隆”或布尔值。我该怎么做呢?

public void setSpeed(double speed)
{
    if(method called by any class other than Airplane.java)
    {
        //throw exception
    }
    else
    {
        //continue setting speed
    }
}

【问题讨论】:

  • 坦率地说,这项任务似乎没有多大意义。这是你不想在生产代码中做的事情。
  • State 方法是 Airplane 内部类吗?

标签: java exception public


【解决方案1】:

由于这些是非静态方法,我们可以使用getClass() 来检查谁调用了该方法,并将其与Airplane.class 进行比较。 getStackTrace() 技术很棒,但这里不需要。此外,我们应该使用!= 而不是equals(Object),因为我们要检查实际的类,并且不允许出现Airplane.equals(Object) 的实现不检查子类的情况。

public void something() {
    if (Airplane.class != getClass()) {
        throw new IllegalArgumentException("Cannot call from " + getClass());
    }
    // and so on...
}

【讨论】:

  • 不,这不起作用。如果对象是Airpane 的子类,这只会失败。此外,是否抛出异常完全独立于调用类。例如。 new Airpane().something() 无论在哪里调用都不会抛出异常。
  • 好点。我得再想一想。
【解决方案2】:

我同意这个要求是无稽之谈,但这可以做到:

public void setSpeed(double speed)
{
   if(!Airplane.class.equals(Thread.getCurrentThread().getStacktrace()[1].getClass()))
   {
    //throw exception

【讨论】:

    猜你喜欢
    • 2011-04-11
    • 2011-07-26
    • 1970-01-01
    • 2014-08-06
    • 1970-01-01
    • 2010-11-10
    • 1970-01-01
    • 2015-03-07
    • 1970-01-01
    相关资源
    最近更新 更多