3

戦士の強さと戦士の武器をフォームに含む、戦士の説明をコンソールに出力したいと思います。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 は、デバッグなどのためにオブジェクトのテキスト表現を生成するためのものであり、任意の出力を返すためではなく、特にアプリケーション依存の出力を返すためのものではないようです。

4

6 に答える 6

3

はい、 i18nに行きます、

messages.properties
displayMessage = This {0} warrior uses a {1}

messages.properties_en_US
displayMessage = This {0} warrior uses a {1}

public static String getString(String key, Object... params  ) {
        try {
            return MessageFormat.format(RESOURCE_BUNDLE.getString(key), params);
        } catch (MissingResourceException e) {
            return '!' + key + '!';
        }
}
于 2011-04-11T06:48:15.477 に答える
1

その場合、ゲッターは、データ(WarriorクラスとWeaponクラス)をUI(ゲッターを呼び出して説明文字列、ウィジェット、HTMLコードなどを作成する)から分離できるため、私には良い習慣のように思えます。ただし、ウォリアーゲッターに文字列を作成させるのではなく、ウォリアーの説明を返すだけで、UIクラスが文字列を作成します(Warrior.getDescription()サンプルで提案するメソッドが行うこと)。

于 2011-04-11T06:52:49.123 に答える
1

Warrior クラスで toString をオーバーライドして、それを実現できます。

public String toString() {


return "This " + this.description + " warrior uses a " + weapon.toString();

}

名前を返すために toString inWeapon をオーバーライドします。

なので

public String toString() {

    return this.name;

    }

そして、あなたは直接印刷することができます

System.out.println(warrior);
于 2011-04-11T06:47:37.153 に答える
1

Warrior と Weapon の両方でメソッド toString() をオーバーライドします。このメソッドは、オブジェクトの String 表現を自然に返すからです。次に、説明を作成する専用のクラスを作成します。たとえば aDescriptionMakerで、その中にメソッドを作成します。

String createDescription(Warrior warrior, Weapon weapon)
{
    return "This " + warrior + " uses a " + weapon;
}

このメソッドの戻り値は、コンソールに出力できます。DescriptionMakerまた、内部化はクラスに適用できます。

于 2011-04-11T06:47:48.010 に答える
1
public Interface IWarriorView {
  public void display(String description, Weapon weapon);
}

public Interface IWeaponView {
  public void display(String name);
}

public class WeaponViewImpl {
  public void display(String name) {
    System.out.println(name);
  }
}

public class WarriorViewImpl {
  public void display(String description, Weapon weapon) {
    System.out.println("This " + description + " warrior uses a ");
    weapon.display(new WeaponImpl());
  }
}

// Warrior class
public String display(IWarriorView view) {
  view.display(description, weapon);
}

// Weapon class
public String display(IWeaponView view) {
  view.display(name);
}
于 2011-07-01T04:41:47.453 に答える
0

両方を組み合わせるのはどうですか:

//Warrior class
public String display() 
{
  return "This " + description + " warrior uses a "+weapon.display();;

}

//Weapon class
public String display() 
{
  return name;
}
于 2011-04-11T06:47:24.147 に答える