如何让我的对象在java中正确交互

时间:2011-04-21 06:01:55

标签: java oop

我最近开始学习java作为我第一次进入面向对象编程的步骤,并且在使我的对象正确交互时遇到了麻烦,所以我有一些问题,这看起来非常简单但是由于某些原因我找不到其他地方的答案:

首先,我一直试图让一个对象从另一个对象中读取值,在这种情况下,它是一个名为“game”的对象,从多个对象中读取属性称为“Item”,这是我可以让游戏对象读取的唯一方法item对象的值是通过在item类中有一个返回我想要的值的方法,并且考虑到每个项目都有很多我希望游戏类能够读取的属性,这似乎不是特别的有效的方法来做到这一点。那么,有没有办法简单地从对象中读取值?例如,简单地将变量称为item1.points或item2.name,其中item 2是对象名称,points是对象中的变量名称?

其次,当我为每个项目分配值时(我让用户在游戏开始时指定了某些值)有没有办法简单地循环相同的问题,询问属性值并将它们分配给我的项目顺序?即item1然后item2然后item3而不是选择语句来决定我最近的项目?

基本上就是我现在遇到的麻烦,任何帮助都会非常感激。此外,在任何人要求我查阅之前,我一直试图查找它无济于事,但我可能只是使用错误的关键字来搜索这个,所以在这方面的任何帮助也将非常受欢迎。 / p>

由于

4 个答案:

答案 0 :(得分:1)

我同意凯尔关于你的第一个问题。 java bean标准基于访问器方法:getter和setter。像Eclipse这样的IDE可以帮助你自动生成这些方法。

关于在对象属性上进行交互,您可以使用Apacha Commons Beanutils项目来执行此操作:

// Copy properties from someObject to myTargetObject
Map attributes = BeanUtils.describe(someObject);
SomeBean myTargetObject = new SomeBean();

for(String propertyName : attributes.keySet()){
  System.out.println("Value for attribute " + propertyName + " is " + attributes.get(propertyName));

  // Updates target object
  BeanUtils.setProperty(myTargetObject, propertyName, attributes.get(propertyName));
}

答案 1 :(得分:0)

您的第一个问题的答案是肯定的,任何标记为public的字段都可以直接访问,但这会破坏信息隐藏的目的,这是OOP的核心。 你的第二个问题有点困难。你可以在技术上循环遍历这样的对象上的属性,但是它需要你使用反射,这可能比利益更有用。

答案 2 :(得分:0)

同意凯尔。您还可以考虑将这些object.item_n属性收集到某种属性集合中(如HashMap<String, String> textualproperties)并迭代这些或其他任何属性。

答案 3 :(得分:0)

对于您的第一个问题,请确保两个类都在同一个包中,并且成员被声明为public(不推荐)或protected(更好),或者不指定任何访问说明符(更多一点)限制性而不是受保护的)。如果您遵循这一点,那么两个对象都属于同一个包中定义的类,可以访问/修改彼此的成员而无需getter / setter。

对于您的第二个问题,请使用反射逐个浏览成员。看这里: http://java.sun.com/developer/technicalArticles/ALT/Reflection/

它将告诉您如何动态地了解类的方法,成员等。