【问题标题】:public method returns private class instance in Java?公共方法返回Java中的私有类实例?
【发布时间】:2011-07-21 19:26:50
【问题描述】:

我有一个返回私有类实例的方法,我需要从不同的包访问它的方法以进行单元测试。这些类存在于同一个文件中。 它是这样的:

文件:A.java

public class A{
    B b;
    public B getB(){
        return b;
    }  
    public setB(B b){
        this->b = b;
   }
}

class B{
    C c;
    public C getC(){
        return c;
    }
    public setC(C c){
        this->c = c;
   }
}

class C{
    public int getInt(){
        return 1;
    }
}

所以...基本上问题是:B 或 C 中的任何方法是否可以通过某种方式访问​​?我是否有义务将 B 和 C 放在不同的文件中并将它们公开以完成此操作?

【问题讨论】:

  • 在大多数情况下,您应该坚持每个文件 1 个类。将BC 包含在A.class 中的令人信服的理由是什么?
  • 另外,this->bthis->c 不是有效的 Java 语法。

标签: java class package private public


【解决方案1】:

从技术上讲,这些类是受保护的;所以只要调用 getB 和 getC 的类在同一个包中,你就不会有任何问题。如果您尝试从另一个包运行 GetB GetC,您会看到一些问题,因为您的其他包将无法访问实际的类。

此处无法导入 TestProt,因为它在 tester2 包中受到保护。 文件1:

package tester; 
import tester2.Test; 
public class Testing {   
  public Testing() {
    Test t = new Test();
    TestProt p = t.prot();   
  } 
}

文件2:

package tester2;
public class Test {
  public TestProt prot() {
    return new TestProt();
  } 
}

class TestProt{
  public TestProt() {
  } 
}

【讨论】:

    【解决方案2】:

    最好的做法是始终将每个顶级类的源代码放在单独的文件中。如果您不这样做,您可能在编译等方面遇到困难。

    还有一个单独的问题是 BC 类是否需要为 public 以便您可以创建单元测试。我会说这可能是个好主意,但有几种方法可以解决这个问题:

    • 如果您将单元测试与ABC 类放在同一个Java 包中,那么这些类(及其方法)将对单元测试可见。

    • 您可以通过为测试目的创建BCpublic 子类来公开这些方法。这些必须在与ABC 类相同的Java 包中声明。

    • 您可以创建BC 的实例并使用反射调用它们的方法。 (但这对于单元测试来说工作量很大,我不推荐它!)

    请注意,如果您的产品代码和测试代码有单独的源目录树,您可以将测试类放入与ABC 相同的包中,而不会混淆代码库。当您为生产/发布构建时,您只需将测试树中的类排除在构建之外。


    顺便说一句,在您的示例中,BC 类是“包私有”而不是“私有”。对真正的“私有”类进行单元测试是完全不同的问题。

    【讨论】:

      【解决方案3】:

      您想使用反射通过单元测试来测试私有方法。你可以在这里阅读更多内容(见答案):

      How do I test a class that has private methods, fields or inner classes?

      【讨论】:

        【解决方案4】:

        是的,您可以使用 reflection 在任何地方调用 BC 的任何实例中的所有方法,但是从我的 POV 来看,是一种技巧,而不是一种技巧。

        否则,BC 类不会暴露在您的 A.class 之外。

        【讨论】:

          猜你喜欢
          • 2013-04-05
          • 1970-01-01
          • 2014-11-20
          • 2014-01-03
          • 1970-01-01
          • 2014-08-06
          • 1970-01-01
          • 2011-12-08
          • 1970-01-01
          相关资源
          最近更新 更多