编辑:我回答了这个问题,因为有很多人在学习编程,都在问这个问题,而且大多数答案在技术上都很称职,但是如果您是新手,他们就不那么容易理解了。我们都是新手,所以我想我会尝试更友好的新手答案。
主要的两个是多态和验证。即使只是一个愚蠢的数据结构。
假设我们有一个简单的类:
public class Bottle {
public int amountOfWaterMl;
public int capacityMl;
}
一个非常简单的类,其中包含有多少液体以及其容量是多少(以毫升为单位)。
当我这样做时会发生什么:
Bottle bot = new Bottle();
bot.amountOfWaterMl = 1500;
bot.capacityMl = 1000;
好吧,您不会期望它起作用,对吗?您希望进行某种健全性检查。更糟糕的是,如果我从未指定最大容量怎么办?哦,亲爱的,我们有问题。
但是,还有另一个问题。如果瓶子只是一种容器怎么办?如果我们有几个容器,都装有容量和数量的液体怎么办?如果我们可以仅创建一个接口,那么我们可以让程序的其余部分接受该接口,并且瓶子,塑料桶和各种物品都可以互换使用。那会更好吗?由于接口需要方法,因此这也是一件好事。
我们最终会得到如下结果:
public interface LiquidContainer {
public int getAmountMl();
public void setAmountMl(int amountMl);
public int getCapacityMl();
}
大!现在我们将Bottle更改为:
public class Bottle extends LiquidContainer {
private int capacityMl;
private int amountFilledMl;
public Bottle(int capacityMl, int amountFilledMl) {
this.capacityMl = capacityMl;
this.amountFilledMl = amountFilledMl;
checkNotOverFlow();
}
public int getAmountMl() {
return amountFilledMl;
}
public void setAmountMl(int amountMl) {
this.amountFilled = amountMl;
checkNotOverFlow();
}
public int getCapacityMl() {
return capacityMl;
}
private void checkNotOverFlow() {
if(amountOfWaterMl > capacityMl) {
throw new BottleOverflowException();
}
}
我将把BottleOverflowException的定义留给读者练习。
现在注意这有多健壮。现在,我们可以通过接受LiquidContainer而不是Bottle来处理代码中的任何类型的容器。这些瓶子如何处理此类物品可能会有所不同。您可以让瓶子在其更改时将其状态写入磁盘,或者保存在SQL数据库或GNU上的瓶子还知道其他什么。
所有这些可能都有不同的方式来处理各种杂音。瓶子只是检查,如果溢出,则抛出RuntimeException。但这可能是错误的事情。(关于错误处理,有一个有用的讨论,但是我在这里故意使它非常简单。有评论的人可能会指出这种简单化方法的缺陷。))
是的,似乎我们已经从一个非常简单的想法变成了迅速获得更好的答案。
另请注意,您不能更改瓶子的容量。现在它被固定在石头上了。您可以通过将int声明为final来实现。但是,如果这是一个列表,则可以将其清空,向其中添加新内容,等等。您不能限制接触内脏。
还有不是所有人都解决的第三件事:getter和setter使用方法调用。这意味着它们看起来像其他任何地方的普通方法一样。您不必在DTO和内容上使用怪异的特定语法,而到处都有相同的东西。