【问题标题】:Passing to Setter and Getter methods传递给 Setter 和 Getter 方法
【发布时间】:2015-05-21 22:01:34
【问题描述】:

我有一个 Bread 类和一个 Filling 类,用于设置面包类型和每片卡路里,还有一个用于设置填充类型和每份卡路里的填充类......我似乎无法弄清楚如何通过他们正确地进入三明治班。我的总卡路里没有计算出来

    private class Sandwich {
        private Bread bread;
        private Filling filling;
        private Bread caloriesPerSlice;
        private Filling caloriesPerServing;



    private Sandwich(String breadType, int caloriesPerSlice, String fillingType, int caloriesPerServing) {
        setBread(bread);
        setBread(caloriesPerSlice);
        setFilling(caloriesPerServing);
        setFilling(filling);
    }

    public Bread getBread() {
        return bread;
    }

    public void setBread(Bread bread) {
        this.bread = bread;

    }

    public Filling getFilling() {
        return filling;
    }

    public void setFilling(Filling filling) {
        this.filling = filling;

    }

    public int getTotalCalories(int caloriesPerSlice,int caloriesPerServing) {

        (caloriesPerSlice) * 2 + caloriesPerServing =  totalCalories;
        return this.totalCalories;
    }

}

【问题讨论】:

  • (caloriesPerSlice) * 2 + caloriesPerServing = totalCalories; 看起来很可疑

标签: java methods inner-classes setter getter


【解决方案1】:

你的变量赋值倒过来了。

(caloriesPerSlice) * 2 + caloriesPerServing = totalCalories; 无效。被赋值的变量必须在左边。

尝试: totalCalories = (caloriesPerSlice) * 2 + caloriesPerServing;

【讨论】:

  • 从技术上讲,它是有效的,即它会编译,但很可能是 OPs 问题。
【解决方案2】:

(caloriesPerSlice) * 2 + caloriesPerServing = totalCalories; 没有做你认为的事情。

也许你的意思

totalCalories = (caloriesPerSlice) * 2 + caloriesPerServing;

【讨论】:

    【解决方案3】:

    我发现您的代码中存在一些问题:

    • 为什么Sandwich 的实例内部应该有两个Bread 对象?三明治通常由一种面包制成。
    • caloriesPerSlicecaloriesPerServing应该分别是BreadFilling的属性。
    • 您不能将String 参数传递给setFilling(Filling filling) 方法。
    • (caloriesPerSlice) * 2 + caloriesPerServing 不是有效的左值,也不是有效的表达式,因为 caloriesPerSlicecaloriesPerServing 是对象。

    这是你想法的一个非常基本的实现:

    面包.java

    public class Bread
    {
        private String type;
        private int caloriesPerSlice;
    
        public Bread(String type, int caloriesPerSlice)
        {
            this.type = type;
            this.caloriesPerSlice = caloriesPerSlice;
        }
    
        public String getType() { return type;}
    
        public int getCaloriesPerSlice() { return caloriesPerSlice; }
    
        public String toString()
        {
            return type + " (" + caloriesPerSlice + "cal)";
        }
    }
    

    Filling.java

    public class Filling
    {
        private String name;
        private int caloriesPerServing;
    
        public Filling(String name, int caloriesPerSlice)
        {
            this.name = name;
            this.caloriesPerServing = caloriesPerSlice;
        }
    
        public String getName() { return name;}
    
        public int getCaloriesPerServing() { return caloriesPerServing; }
    
        public String toString()
        {
            return name + " (" + caloriesPerServing + "cal)";
        }
    }
    

    三明治.java

    public class Sandwich
    {
        private Bread bread;
        private Filling filling;
    
        public Sandwich(Bread bread, Filling filling)
        {
            this.bread = bread;
            this.filling = filling;
        }
    
        public int getTotalCalories()
        {
            return 2 * bread.getCaloriesPerSlice() + filling.getCaloriesPerServing();
        }
    
        public String toString()
        {
            return "Bread: " + bread.toString() + "\nFilling: " + filling.toString();
        }
    }
    

    Main.java

    public class Main
    {
        public static void main(String args[])
        {
            Bread bread = new Bread("Baguette", 150);
            System.out.println("I would like a " + bread.toString());
    
            Filling filling = new Filling("Prosciutto di Parma", 75);
            System.out.println("with " + filling.toString());
    
            Sandwich sandwich = new Sandwich(bread, filling);
            System.out.println("Your order is:");
            System.out.println(sandwich.toString());
    
            int totalCalories = sandwich.getTotalCalories();
            System.out.println("The total calories are " + totalCalories);
        }
    }
    

    这是输出:

    I would like a Baguette (150cal)
    with Prosciutto di Parma (75cal)
    Your order is:
    Bread: Baguette (150cal)
    Filling: Prosciutto di Parma (75cal)
    The total calories are 375
    

    【讨论】:

      【解决方案4】:

      这个类有很多错误:

      • 你有一个 BreadcaloriesPerSlice,但构造函数使用与 int 相同的变量。

      • FillingcaloriesPerServing 和 intcaloriesPerServing 相同。

      • 它有一个私有构造函数。此构造函数指定您可以访问此类型的类的唯一方法是通过类中的静态方法,该方法返回一个 Sandwich 对象(如单例模式),这里不是这种情况。

      • 类是私有的:也许我错了,但是java中的私有类意味着没有人可以访问它。

      • 构造函数:例如breadType是一个字符串对象,没有用到。您正在尝试使用私有变量来设置面包……那是什么?

      • 构造函数:caloriesPerSlice 是一个 int 类型,您可以在接收 Bread 类型的 setBread() 设置器中使用它。你在混合类型。

      • 与在setFilling()中使用的caloriesPerServing相同,它接收一个Filling对象......

      • getTotalCalories:分配在右侧,而不是左侧。

      我认为您对 OO 有误解。例如,让我们看一下 Bread 类:

      如果面包类具有 caloriesPerSlicebreadType 属性,它们可能是面包类型的一部分。让我们更改类以反映这些属性:

          public class Bread {
            private int caloriesPerSlice;
            private String type;
      
            public Bread(String type, int caloriesPerSlice)
            {
              this.type = type;
              this.caloriesPerSlice = caloriesPerSlice;
            }
      
            public int getCaloriesPerSlice()
            {
              return this.caloriesPerSlice;
            }
      
            public String getType()
            {
              return this.type;
            }
          }
      

      在这种情况下,面包是通过他的构造函数完全定义的。您可以看到该类没有设置器。那是因为我决定了它,但是如果你想要一个无参数的构造函数和类中的设置器,这取决于你。在这种情况下,我只定义了 getter。让我们看看 Filling 类:

          public class Filling {
            private int caloriesPerServing;
            private String type;
      
            public Filling(String type, int caloriesPerServing) {
              this.caloriesPerServing = caloriesPerServing;
            }
      
            public int getCaloriesPerServing()
            {
              return hits.caloriesPerServing;
            }
      
            public void setCaloriesPerServing(int calories)
            {
              this.caloriesPerServing = calories;
            }
      
            public String getType()
            {
              return this.type;
            }
      
            public void setType(String type)
            {
              this.type = type;
            }
          }
      

      这里的 Filling 类有 getter 和 setter。这只是为了解释的目的:在 Filling 类中,您可以通过构造函数或 setter 设置属性,而在 Bread 中,您只能通过构造函数定义属性。

      现在三明治可能可以接收定义面包和馅料的所有属性(就像您的情况一样),或者它可以接收面包和馅料)。我们来看第一种情况:

          public class Sandwich {
              private Bread bread;
              private Filling filling;
      
              public Sandwich(String breadType, int caloriesPerSlice, String fillingType, int caloriesPerServing) {
                  this.bread = new Bread(breadType, caloriesPerSlice);
                  this.filling = new Filling(fillingType, caloriesPerServing);
              }
      
              public Bread getBread() {
                  return bread;
              }
      
              public void setBread(Bread bread) {
                  this.bread = bread;
      
              }
      
              public int getTotalCalories() {
                  return this.bread.getCaloriesPerSlice() * 2 + this.filling.getCaloriesPerServing();
              }
          }
      

      如您所见,我们在 Sandwich 构造函数中收到了定义面包和馅料的所有参数。然后,我们创建了 Bread 和 Filling 对象,并传递了它们的参数。最后,getTotalCalories 只不过是面包和馅料属性的简单数学运算。

      这段代码只是在文本编辑器中编写的。没检查好不好。

      在这个例子中,Sandwich 变成了一个类和一个工厂,是类的一个非常重要的组成部分。如您所见,Bread 和 Filling 类的构建是通过 Sandwich 完成的。它的优势在于 Sandwich 控制对象的创建,但问题是:三明治是否对此负责?也许不是,因为当您在家中制作三明治时,您会得到面包和其他成分,你只是把它们放在切片上......三明治不负责面包片的制作......它在现实生活中没有意义。那么,在 Sandwich 构造函数中删除对象创建可能是个好主意:

              public Sandwich(Bread bread, Filling filling) {
                  this.bread = bread;
                  this.filling = filling
              }
      

      这种情况更“正确”,因为您正在使用已在内存中生成的元素制作三明治。在家里做三明治也是一样:先拿到面包、馅料,然后再做三明治。

      我希望这可以进一步说明 OO。

      您好!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-14
        • 2017-09-09
        • 2017-08-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-07
        • 1970-01-01
        相关资源
        最近更新 更多