【问题标题】:Check if class has member variable?检查类是否有成员变量?
【发布时间】:2017-01-12 01:12:42
【问题描述】:

我编写了一个小程序,其中包含几个已定义的类。我正在为这些课程编写测试。我为其中一个类编写的构造函数有一个参数,它是另一个类的实例。所以,它看起来像这样:

interface type1 {}
interface type2 {}

class class1 implements type1{
    String something;
    int somethingElse;
    //...
}

class class2 implements type1{
    String something2;
    int somethingElse2;
    //...
}

class class3 implements type2{
    Object obj1;
    Object obj2;
    String blabla;
    //...

    class3(Object inObj1, Object inObj2, String x){
        this.obj1 = inObj1;
        this.obj2 = inObj2;
        this.blabla = x;
    }
} 

如上所述,我正在创建测试。有两个测试类(每个接口一个)。我希望它们看起来像这样:

class ExamplesType1{
    class1 type1Something1 = new class1(...);
    class2 type1Something2 = new class2(...);

}

class ExamplesType2{
    class3 type2Something = new class3(type1Something1, type1Something2, ...);
}

我的问题是,我如何从 ExamplesType2 访问属于 ExamplesType1 成员的对象,以便我可以...运行我的测试?假设我不能在同一个类中测试两个接口,并且我不能在 ExamplesType1 和 ExamplesType2 中再次定义定义的对象。

我知道我可以创建一个返回函数(例如,getType1Something()),但它们是公共的,所以我不应该能够在不定义函数的情况下访问它们吗?

对不起,如果这是一个新手问题...今天刚开始使用 Java。

感谢您的帮助!如果需要任何澄清,请告诉我。

【问题讨论】:

  • 如果遵循类和接口名称的命名约定会更好。根据 Oracle:“类名应该是名词,大小写混合,每个内部单词的首字母大写。”
  • 您必须先创建ExamplesType1 的实例,然后才能访问公共字段。不过,您确实应该使用 getter 方法。
  • 您的代码中没有公共成员。
  • @4castle 我同意你的看法,我应该。但我不能……这是一项有一些弱智要求的学校作业。创建一个实例可能会起作用......看不出他们(TA)为什么会拿分。谢谢。
  • Access level modifiers 确定其他类是否可以使用特定字段或调用特定方法。

标签: java class class-members


【解决方案1】:

假设 ClassA 有两个实例化类,ClassBClassC 实例化为

ClassB classB = new ClassB();
ClassC classC = new ClassC();

ClassBClassC public 变量可以在ClassA 中引用,例如:classB.variableName

这可以引用从原始类型到对象的任何public 对象。

如果类未实例化,则public 变量必须另外使用static 关键字才能被引用。这个static 引用允许您绕过父类和实例化的封装。

也就是说ClassB可以引用父类ClassA来检索自己的一个public static实例,但如果不是static变量,则必须依赖实例化,静态getter方法,或使用 getter 方法进行实例化以访问这些对象。

希望这会有所帮助:)

【讨论】:

  • 我很高兴它有帮助:)
【解决方案2】:

假设你有两个类

class ClassA {
    String flag;
    ...
}

class ClassB {
    String flag;
    ...
}

您有几个选项可以从这些类中访问字段成员。

  1. 通常推荐的方法是为字段创建 setter 和 getter。这样,任何持有对这些类实例的引用的块都将能够访问和修改这些字段。

  2. 您还可以选择将这些字段设为公开,这也将允许保存对这些类的引用的任何代码块访问公开字段。

  3. 如果您希望某些类可以访问这些字段,但不是每个人(非公开),您可以将它们设置为包保护。这将允许同一包中的任何其他类访问这些字段,但不允许其他任何人访问。要使字段(或方法)包受到保护,您只需不为相关字段指定访问修饰符(公共或私有)。你可以阅读更多here

  4. 最后,对于测试来说非常方便的是使用反射来访问私有成员。反射不是很高效,而且有点老套,但在某些情况下它可以非常方便。我在单元测试中主要使用反射来模拟对象,但也看到它以非常有趣的方式使用。

    Field field = MyClass.getDeclaredField("fieldName"); field.setAccessible( 真 ); String flag = field.get(myInstance);

PS>主要是凭记忆写的,但我相信这应该能让你继续前进。

希望这会有所帮助!祝你好运!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-13
    • 2016-07-09
    • 2016-04-26
    • 2020-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多