在Java中返回不同类型的更好方法

时间:2011-03-16 21:24:19

标签: java oop return-value

public int attack(Bear bear)
{
    int newStamina=bear.getStamina() - 50;  
    bear.setStamina(newStamina);
    return bear.getStamina();
}

为了扩展我神话般的Bear课程,我决定实施attack(!)方法。

我有2个熊对象实例:Bear1和Bear2。

在我脑海里:

Bear1.attack(Bear2);

然后我的代码获得Bear2当前的耐力值并从中获取50,将其分配给newStamina变量。

Bear2然后使用setStamina方法传递这个新的stamina变量。

在残酷的熊袭击之后,我返回Bear2当前耐力。

这是有效的。但我想有更好的方法。

安美居。我想做的是:

int newStamina=bear.getStamina() - 50;

是:

if(newStamina <= 0)
{
    // the bear is dead!
}

现在我的方法attack返回int,因为如果熊没有死,它仍然有HP,我想将此当前HP输出到控制台或任何地方。

如果熊没有耐力,那么我需要返回一些表示这一点的东西。

你会做什么?我不能回复假,我不确定无论如何都会有用。

7 个答案:

答案 0 :(得分:0)

我试过这个 - 返回一个对象而不是一个int。

public Bear attack(Bear bear)
{
        int newStamina=bear.getStamina() - 50;  
        bear.setStamina(newStamina);
        if(newStamina<=0)
        {
            bear.isDead=true;
        }
        return bear;
}

// in main
while(Bear2.isDead==false)
{
            Bear1.attack(Bear2);
            System.out.println(Bear2.getStamina());
}

if(Bear2.isDead)
{
    System.out.println(Bear2.getName() + " is dead :(");
}

似乎工作..!将有兴趣看到其他解决方案。

答案 1 :(得分:0)

一个好的经验法则是仅修改set方法中的实例变量。这样做可以使您的代码更易于管理。

/**
 * reduce this bears stamina by the given amount
 */
public void reduceStamina(int reduction) {
    setStamina(getStamina() - reduction);
}

public void isDead() {
    return getStamina() < 0;
}

public void attack(Bear otherBear) {
    otherBear.reduceStamina(50);
    if(otherBear.isDead()) {
        this.victoryDance();
    }
}

答案 2 :(得分:0)

从OOP的角度来看,我会将对象“熊”与其属性“stamina”从对象“战斗”中分开,对象“战斗”持有两只熊并处理攻击并“仍然活着”。几周前我在一个非常相似的问题上发表了一些例子:help with changing arrays into individual variables in Java

答案 3 :(得分:0)

而不是int您可以返回Integer。如果熊死了,你可以返回null

public Integer attack(Bear attackedBear){
    Integer resultingStamina;
    ...
    if(resultingStamina<=0){
        resultingStamina = null;
    }
    return null;
}

答案 4 :(得分:0)

可能会为你完成这项工作:

public int attack(Bear bear)
    {
        int newStamina=bear.getStamina() - 50;  
        bear.setStamina(newStamina);
        if(newStamina<=0)
        {
          bear.isDead=true;
        }
        return bear
    }

并在你的主要部分验证退回的熊是否仍有耐力,如果不是GAME OVER ......

答案 5 :(得分:0)

public static void main()
{    
      Bear b1 = new bear();
      Bear b2 = new bear();
      while(!b2.IsDead())
      {
            b1.attack(b2);
            System.out.println(b2.getStamina());
      }

      System.out.println(b2.getName() + " is dead :(");
}



public class Bear
{
    private int _stamina;

    public int getStamina()
    {
          return _stamina;
    }

    public bool Isdead()
    {
          return _stamina == 0;
    }

    public void sufferAttack(int dommage)
    {
      _stamina = dommage > _stamina ? 0:(_stamina - dommage);
    }

    public void attack(Bear b)
    {
         b.sufferAttack(50);
    }
}

现在的原因。

首先。永远不要暴露内部属性。遵循Demeter定律,除了对象本身应该能够改变他当前的状态。

第二,返回int(b2的耐力)是没有意义的。 B1攻击b2和b1的方法返回b2耐力? B1号有责任攻击b1和b2遭受攻击的责任,并提供揭露其当前状态的方法。

在返回任何类型的值之前,你必须考虑每个类(以及每个方法)的责任。

当熊受到攻击时,我预计另一只熊会受到攻击,而当熊遭受攻击时,我预计它会失去一些耐力。

答案 6 :(得分:-1)

这样的事情:

return new Pair <Integer, Boolean> (newStamina, bear.isAlive());

不太好:返回2个整数,一个代表bool:

return new int [] {newStamina, bear.isAlive() ? 1 : 0};