我想在控制台上打印一个战士的描述,其中包括战士的力量和战士的武器,格式This <description> warrior uses a <weapon>
为例如:This strong warrior uses a butter knife
.
为清楚起见进行编辑:我想这样做而不是通过使用 getter 或任何其他方法(如 toString)来向对象询问数据,这揭示了对象的内部实现。我也想在不将我当前的 UI(控制台)硬编码到对象本身的情况下做到这一点。
public class Warrior
{
private String description;
private Weapon weapon;
public Room(String description, Weapon weapon)
{
this.description = description;
this.weapon = weapon
}
}
public class Weapon
{
private String name;
public Weapon(String name)
{
this.name = name;
}
}
避免吸气剂
我可以通过对 UI 进行硬编码来避免吸气剂:
//Warrior class
public void display()
{
String.out.println("This " + description + " warrior uses a ");
weapon.display();
}
//Weapon class
public void display()
{
String.out.print(name);
}
避免硬编码的 UI
我可以通过使用 getter 来避免硬编码的 UI:
//Warrior class
public String getDescription()
{
return "This " + description + " warrior uses a " + weapon.getName();
}
//Weapon class
public String getName()
{
return name;
}
可以避免两者吗?在上面的例子中我该怎么做?
注意:为了响应一些初步的答案,getter 不是遵循命名约定的方法getSomeFieldName
。因此,重命名getSomeFieldName
为aMethodThatIsNotPrefixedByGet
不是解决方案。getter 是一种将私有数据从对象传递到调用它的作用域的方法。
完全清楚的是,我在这里要处理的问题与数据封装有关(因为这个问题被标记了)。如何防止将数据传递给不需要知道该数据的对象并且仍然避免对 UI 进行硬编码?
此外,基于这些 问题 ,我认为不应以许多答案所建议的方式使用 toString 。toString 似乎用于生成对象的文本表示以进行调试等,而不是用于返回任意输出,尤其是不用于返回依赖于应用程序的输出。