【问题标题】:storing boolean value存储布尔值
【发布时间】:2012-01-02 19:33:09
【问题描述】:

我有一个问题,如何更改给定类的布尔值,以便一旦再次遇到它,它就具有上次设置的值。这是我的课

public class Sandwich {
    private String type;
    private double price;
    private String ing;
    public boolean owned;

    Sandwich (String t, double p, boolean o){
        type = t;
        price = p;
        owned = o;
    }

    public boolean getO(){
        return this.owned;
    }

    public void setO(boolean o){
        this.owned = o;
    }

    public String getType(){
        return this.type;
    }
}

以及访问和应该更改的位置:

public void purchase(Sandwich s) {
    boolean owned = s.owned;

    //I tried also with accessor and mutator here but then changed to public
    String type = s.getType();
    if (owned == false) {
        if (money <= 0){ 
            System.out.println("Worker " + this.name + " can not buy " + type + " sandwich, cuz he doesn't have enough money");
        } else {
            System.out.println("Worker " + this.name + " can buy " + type + " sandwich");
            this.money = money;
            owned = true;

            //this is the place where it is supposed to change value to true (sandwich was bought and has owner now
            s.owned = owned;
        }
    } else if (owned == true) {
        System.out.println("Worker " + this.name + " can not buy " + type + " sandwich cuz it was bought");
        System.out.println("Test");
    }
}

问题是,尽管过去购买了给定的三明治,但每次我尝试运行此代码时,它的拥有值都设置为 false。我需要三明治记录所拥有的更改值,以便下次我运行该条件时将拥有 == true。怎么可能

【问题讨论】:

  • 所以你需要它在应用程序的运行之间持久化吗?或者当应用程序运行时?
  • 请使用if (owned)(!owned),注意在这种情况下执行与!owned相反的测试是多余的,如果不是!owned,它将始终是owned
  • 无论您遇到什么问题,都与 Sandwitch 类中的布尔值无关。如果您要单独测试该功能,您会发现设置和读取它可以正常工作。你正在做一些你没有发布的代码,将owned设置为false
  • 你是不是把卖的三明治和没卖的混在一起,随便挑一个卖,看看有没有卖?看起来你没有正确设计你的三明治店。
  • 有没有可能您使用的不是同一个Sandwich 实例而是一个新实例?

标签: java boolean


【解决方案1】:

您的设计似乎存在缺陷。您需要在 Worker 和 Sandwish 类型之间建立关系。

您可以做的只是在工人类中实现一个已购买三明治类型的列表,并在工人购买三明治时与它进行比较。

或者,如果您愿意,您可以拥有一个包含所有 Sandwish 类型的哈希图,并带有一个布尔值,指示该类型是否已被购买。

【讨论】:

  • 每次运行代码时都会创建一个新的三明治实例。它不是同一个对象。
  • 应该在购买类或代码中的其他地方创建此列表吗?谢谢
  • 如果你想要的话,可以在Worker中定义单个worker购买的类型
  • 我在工人阶级的购买方法中尝试了带有列表的东西。我发现(检查里面有多少项目)它计数为 1、2,然后重新启动(可能在创建新的工作人员后)并再次计数 1,2。每次我只购买 2 个工人的 2 个三明治。工人 Marty = new Worker("Marty", 5);工人 Biff = new Worker("Biff", 12); Marty.purchase(美国); Marty.purchase(奶酪); Biff.purchase(火腿); Biff.purchase(奶酪);
  • 如果您希望您的列表在所有工作人员之间共享,请将其设为静态
【解决方案2】:

您创建了 get 和 set 例程,然后没有使用它们。我会把代码改成这个。

    public void purchase(Sandwich s){
            String type = s.getType();
            if (!(s.getO())){
                if (money <= 0){ 
                    System.out.println("Worker " + this.name + " can not buy " + type + " sandwich, cuz he doesn't have eno

ugh money");
                } else {
                    System.out.println("Worker " + this.name + " can buy " + type + " sandwich");
                    this.money = money;
                    s.setO(true);
                }
            } else {
                System.out.println("Worker " + this.name + " can not buy " + type + " sandwich cuz it was bought");
                System.out.println("Test");
            }
     }

【讨论】:

  • 虽然这是正确的,但它不会改变任何事情。问题不在于类或其owned 字段。
  • @Brian Roach - 再想一想,你更有可能是对的。问题出在其他地方。森林-树木-哎哟!
  • 我仍然建议使用 setter/getter 并将字段本身设为私有。为什么要为一个公开的字段设置一个普通的 setter 和 getter?来自我的 +1 :)
  • 是的,似乎问题出在其他任何想法上。这是一个开发版本,因此该字段是私有的,而不是更改为公共等
  • 如果是这种情况,解决方案相当简单。将其改回私有,看看程序在哪里中断!另一件事是使用搜索引擎查看整个项目中使用 Sandwich.owned 或 getO() 或 setO() 的所有地方。
【解决方案3】:

删除

boolean owned = s.owned;

在你使用过owned的地方使用s.getO()

例如

if (owned == false){ 

可以

if (!s.getO()){

并使用setter方法s.setO(true/false)进行更改。

例如

owned = true;
s.owned = owned;

可以替换为

s.setO(true);

【讨论】:

  • 虽然这是正确的,但它不会改变任何事情。问题不在于类或其owned 字段。
  • 正确。我只是尝试了不同的版本(也有 getter 和 setter),但它不起作用,所以问题似乎出在其他地方
  • 请关注人们所说的并相应地更新您的帖子。
猜你喜欢
  • 1970-01-01
  • 2010-10-25
  • 2015-05-08
  • 2012-03-10
  • 1970-01-01
  • 2021-12-04
  • 2013-04-09
  • 1970-01-01
  • 2019-02-10
相关资源
最近更新 更多