編集:私はこの質問に回答しました。プログラミングを学んでいる人々がこれを求めているので、その答えのほとんどは非常に技術的に有能ですが、初心者の場合はそれほど簡単には理解できません。私たちは皆初心者だったので、もっと初心者にやさしい答えを試してみようと思いました。
2つの主なものは、ポリモーフィズムと検証です。それが単なる愚かなデータ構造であっても。
次の単純なクラスがあるとします。
public class Bottle {
public int amountOfWaterMl;
public int capacityMl;
}
液体の量と容量(ミリリットル)を保持する非常に単純なクラス。
私が行うとどうなりますか:
Bottle bot = new Bottle();
bot.amountOfWaterMl = 1500;
bot.capacityMl = 1000;
まあ、あなたはそれがうまくいくとは思わないでしょう?ある種の健全性チェックが必要です。さらに悪いことに、最大容量を指定しなかった場合はどうなりますか?ああ、私たちは問題を抱えています。
しかし、別の問題もあります。ボトルがコンテナの1つのタイプにすぎない場合はどうなりますか?容量と量が液体で満たされた複数のコンテナがある場合はどうなりますか?インターフェースを作成することができれば、プログラムの残りの部分にそのインターフェースを受け入れさせることができ、ボトル、ジェリカン、およびあらゆる種類のものは交換可能に機能します。それはもっと良いのではないでしょうか?インターフェースはメソッドを要求するので、これも良いことです。
最終的には次のようになります。
public interface LiquidContainer {
public int getAmountMl();
public void setAmountMl(int amountMl);
public int getCapacityMl();
}
すごい!そして今、私たちはボトルをこれに変更します:
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を受け入れることで、コード内のあらゆるタイプのコンテナーを処理できるようになりました。そして、これらのボトルがこの種のものをどのように処理するかはすべて異なります。状態が変化したときにディスクに状態を書き込むボトルや、SQLデータベースに保存するボトルや、GNUが他に何を知っているボトルを持つことができます。
そしてこれらすべては、さまざまなフーピーを処理するための異なる方法を持つことができます。ボトルは単にチェックし、オーバーフローしている場合はRuntimeExceptionをスローします。しかし、それは間違っているかもしれません。(エラー処理については有益な議論がありますが、ここでは意図的に非常に単純にしています。コメントの人々は、この単純なアプローチの欠点を指摘するでしょう。;))
そして、はい、私たちは非常に単純なアイデアから、はるかに優れた答えをすばやく得るようになっているようです。
また、ボトルの容量は変更できませんのでご注意ください。それは今では固まっています。これをfinalと宣言することにより、intでこれを行うことができます。ただし、これがリストの場合は、空にしたり、新しいものを追加したりできます。内部に触れることへのアクセスを制限することはできません。
誰もが対処していない3番目の問題もあります。ゲッターとセッターはメソッド呼び出しを使用します。つまり、他のどこでも通常の方法のように見えます。DTOなどに奇妙な構文を使用する代わりに、どこでも同じことができます。