戦士の強さと戦士の武器をフォームに含む、戦士の説明をコンソールに出力したいと思います。This <description> warrior uses a <weapon>
例: This strong warrior uses a butter knife
.
わかりやすくするために編集:オブジェクトの内部実装を明らかにするゲッターまたはその他のメソッド (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 の回避
ゲッターを使用することで、ハード コーディングされた UI を回避できます。
//Warrior class
public String getDescription()
{
return "This " + description + " warrior uses a " + weapon.getName();
}
//Weapon class
public String getName()
{
return name;
}
両方を回避することは可能ですか?上記の例ではどうすればよいですか?
注: いくつかの最初の回答に応じて、ゲッターは命名規則に従うメソッドではありませんgetSomeFieldName
。したがって、名前getSomeFieldName
をに変更することaMethodThatIsNotPrefixedByGet
は解決策ではありません。ゲッターは、オブジェクトからそれを呼び出したスコープにプライベート データを渡すメソッドです。
完全に明確にするために、ここで対処しようとしている問題は、データのカプセル化に関するものです (この質問にタグが付けられているため)。そのデータを知る必要のないオブジェクトにデータを渡すのを防ぎ、UI のハードコーディングを回避するにはどうすればよいですか?
さらに、これらの質問に基づいて 、多くの回答で提案されている方法で toString を使用する必要はないと思います。toString は、デバッグなどのためにオブジェクトのテキスト表現を生成するためのものであり、任意の出力を返すためではなく、特にアプリケーション依存の出力を返すためのものではないようです。