編集:これを尋ねるプログラミングを学ぶ人がたくさんいるので、私はこの質問に答えました、そして答えのほとんどは非常に技術的に有能です、しかしあなたが初心者であるならば彼らは理解するのが簡単ではありません。私たちはみんな初心者だったので、もっと初心者に優しい答えを試してみようと思いました。
主な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();
}
素晴らしい!そして今、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を受け入れることで、コード内のあらゆるタイプのコンテナーを処理できるようになりました。そして、これらのボトルがこの種のものをどのように扱うかは、すべて異なる可能性があります。ディスクが変更されたときに状態をディスクに書き込むボトル、またはSQLデータベースまたはGNUに保存するボトルが他に何を知っているかを指定できます。
そして、これらはすべて、さまざまなフープを処理するためのさまざまな方法を持つことができます。ボトルはチェックするだけで、オーバーフローしている場合はRuntimeExceptionをスローします。しかし、それは間違ったことかもしれません。(エラー処理については有益な議論がありますが、ここでは意図的に非常に単純にしています。コメントの人々は、この単純なアプローチの欠陥を指摘する可能性があります。;))
そして、はい、私たちは非常に単純なアイデアからはるかに良い答えをすばやく得ることに移行しているようです。
ボトルの容量は変更できませんのでご注意ください。今では石になっています。これは、intでfinalと宣言することで実行できます。ただし、これがリストの場合は、リストを空にしたり、新しいものを追加したりすることができます。内臓に触れることへのアクセスを制限することはできません。
誰もが対処しているわけではない3番目のこともあります。ゲッターとセッターはメソッド呼び出しを使用します。つまり、他の場所では通常の方法のように見えます。DTOなどに奇妙な特定の構文を使用する代わりに、どこでも同じものを使用できます。