public方法在Java中返回私有类实例?

时间:2011-03-24 02:31:58

标签: java class package private public

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

档案: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放在不同的文件中并将其公之于众?

4 个答案:

答案 0 :(得分:1)

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

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

  • 如果将单元测试放在与类ABC相同的Java包中,那么类(及其方法)将显示为单元测试。

  • 您可以通过创建publicB的{​​{1}}子类来公开这些方法,以用于测试目的。这些必须在与CAB类相同的Java包中声明。

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

请注意,如果您的产品代码和测试代码具有单独的源目录树,则可以将测试类放在与CAB相同的包中,而无需混合代码库。在为生产/发布构建时,只需将测试树中的类保留在构建之外。


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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

是的,您可以使用反射在任何地方调用 B C 的任何实例中的所有方法,但是,这来自我的POV,是一种黑客而不是一种技术。

否则, B C 类不会在 A.class 之外公开。

答案 3 :(得分:0)

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

此处不能导入TestProt,因为它在tester2包中受到保护。 FILE1:

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

FILE2:

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

class TestProt{
  public TestProt() {
  } 
}