【问题标题】:Java - Write Code for a Class that isn't yet instantiated?Java - 为尚未实例化的类编写代码?
【发布时间】:2017-11-01 00:49:59
【问题描述】:

所以我正在为将由另一个类“计算器”调用的“技能”类编写代码。 Skill 类通过调用其方法来影响 Calculator 的当前实例。

public class Calculator {
    int number = 0;
    ...
    Skill sk = new Skill();
    sk.hitSkill(true);
    ...
    public void setNumber(int newValue) {
        number += newValue;
    }
}

同时,“技能”类看起来像这样:

public class Skill { 
    Calculator calc = new Calculator();
    public void hitSkill (boolean someConditions) {
        if (someConditions) {
            calc.setHitNumber(20);
        }
}

以上对我没有好处,因为“calc”是一个实例,而不是我想要受到影响的 calc 实例。

我有 Skill 将使用的 Calculator 的 getter 和 setter - 但它需要一个 Calc 实例才能工作。准确地说,它需要调用它的 Calculator 实例,而不仅仅是任何 Calculator 实例。

我为什么不直接将 Calculator 方法设为静态?因为它们会影响我需要能够更改的变量,这些变量不是静态的。

有人有什么建议吗?

【问题讨论】:

  • 你还需要两节课吗?
  • 理想情况下。为了这个问题,我给出的一个相当复杂的应用程序是一个简化版本。即便如此,我也可以把它全部放在一个类中,但这可能是我宁愿避免的非常臃肿的设计。

标签: java methods command instance


【解决方案1】:

Skill 创建一个接受Calculator 参数的构造函数,而不是new Calculator()

public class Skill {
    private Calculator calc;
    public Skill(Calculator calc) { this.calc = calc; }
}

public class Calculator {
    private Skill sk = new Skill(this);
}

【讨论】:

  • 我想过这个,但是 Java 的传递引用状态不会使这个无效吗?
  • 相反,它是通过引用支持这一点。也就是说,保留对原始对象的引用(而不是制作副本)。
  • 一个启发性的花絮,我不会很快忘记的。谢谢!
【解决方案2】:

它看起来像你的作文中的一个循环。你有 Skill 取决于 Calculator 取决于 Skill ...你需要取消选择这个。您可以根据自己对领域的了解做出此决定。

一个明显的解决方案是将计算器注入Skill::hitSkill(),因此:

public class Skill { 
    public void hitSkill (boolean someConditions, Calculator calc) {
        if (someConditions) {
            calc.setHitNumber(20);
        }
}

public class Calculator {
    int number = 0;
    ...
    Skill sk = new Skill();
    sk.hitSkill(true, this);   // <== pass in your instance
    ...
    public void setNumber(int newValue) {
       number += newValue;
    }
}

如果一个技能总是使用同一个计算器,你可以在构造时注入Calculator(而不是每次调用hitSkill())。

【讨论】:

  • 我想这可能是它。我现在就试试看,祈祷吧。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多