【问题标题】:Static import of static Nested class not working静态嵌套类的静态导入不起作用
【发布时间】:2021-08-11 18:25:43
【问题描述】:
package com.foo;
public abstract class A {
    private functionA() {
    }
  static class B {
     A a;
     public functionB() {
       a.functionA();
     }
}

所以,我需要从不同的包中测试 functionA(),但我不能对 A 类或作为约束的包 com.foo 进行任何更改。我正在尝试进行静态导入,以便可以从该包外部访问静态嵌套类 B,但它给了我“找不到符号,符号:静态 B,A 类”的错误,我尝试导入静态 com.foo。 A.* 也是,但在测试类中写入 B.functionB() 时,我收到错误“在测试类中找不到符号 B”。请在下面找到 Test 类语法:

package com.foo.test;
import static com.foo.A.B;
public class Test {
   B.functionB(); 
}

还有其他方法可以从包外部测试 functionA() 或 functionB() 吗?

【问题讨论】:

  • A 无法编译。 functionB 不是静态方法。你到底想做什么?
  • 你需要一个B 的实例来调用functionB()
  • 这只是一个示例代码,不能把实际代码放在这里,所以A类编译并且函数B只使用A类的实例调用函数A
  • 是的,我需要一个 B 的实例来调用 functionB 我正在尝试静态导入,因为它表明 import static com.foo.A.B 应该可以工作,但在我的情况下它给出了未找到的符号错误。
  • 这对我有用..不确定这是否是您正在尝试的。 1. B 是 A 内的公共静态嵌套类 2. 在其他包中,我导入了import foo.A; 3.然后使用new A.B()创建B类的新实例,B的这个实例可以调用functionB

标签: java loops inner-classes static-import


【解决方案1】:

您不能从静态内部类调用外部类的实例方法。

有两种方法可以解决这个问题:

  1. 与其直接测试私有函数,不如调用一个调用私有函数的公共方法并分析副作用。事实上,归根结底,坚持使用公共方法更适合进行黑盒测试。
  2. 您可以将测试类放在同一个包中,但放在不同的源文件夹中。这就是许多 IDE 默认处理它的方式(主代码使用 src/main/java,单元测试使用 src/test/java)。请注意,您的 functionA() 方法必须是包保护的,而不是私有的(即删除 private 关键字)。

也就是说,如果您对当前的方式一心一意,您可以将 B 和 functionB 设为 public,并将 static 修饰符添加到 functionB,只要 functionB 可以访问 instance。当然,这种做法违背了将 functionA 设为私有的意义。

【讨论】:

  • 嗨,这段代码实际上已经存在并且可以工作,所以B类的函数B能够调用外部类A的函数A。我需要测试 functionA 中的一些错误,并且测试应该在不同的包(约束)中,而且我无法在 A 中定义公共函数并从中调用 functionA()。我只需要在 Test 类中做所有需要在不同包中的事情。
  • 我看不出这是如何工作的。当我将您的代码放入我的 IDE 时,它会警告我“无法从静态上下文引用非静态方法 functionA()”。我们谈论的是纯 Java,而不是像 Groovy 这样的东西,对吧?
  • ok,所以有点小错误,B类是通过A类的实例来访问的,所以基本上就是a.functionA(),其中a是A类的实例,A a;跨度>
  • 这应该会更好一些。现在,只需将 functionB 设为 static 并将 B 类设为 public,就可以了。当然,这意味着 functionA 不再是真正私有的,实际上任何东西都可以通过 B 访问 functionA。
猜你喜欢
  • 2013-05-11
  • 2015-01-18
  • 1970-01-01
  • 2011-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
相关资源
最近更新 更多