1

以下は、クラスの練習として行った Java コードです。SavingsAccount という名前のクラスがあります。残高変数と金利変数があります。ただし、それらを公開に設定しましたが、アカウントを個別に扱いたい場合は、それらを非公開にして、それらの変数の「取得/設定」メソッドを使用する必要がありますか? 変数をパブリックにすることでうまくいくことはできませんか?残りのコードには、これらの変数を使用して計算するメソッドがあります。

public class SavingsAccount { //This class has three different variables that define it
    public double balance; //Double for account balance
    public static double annualInterestRate; //Class method for interest rate
    public final int ACCOUNT_NUMBER; //Constant int for keeping track of accounts


public SavingsAccount (int ACCOUNT_NUMBER, double balance) { //Constructor that takes down account number and balance to keep track of
        this.ACCOUNT_NUMBER = ACCOUNT_NUMBER;
        this.balance = balance;
    }
4

8 に答える 8

6

確かに変数を公開することはできますが、そのためにあなたを追い詰める人々がたくさんいます...
これはOOパラダイムでのカプセル化の問題です。通常、オブジェクトは互いの内部を突くことができないようにする必要があります。

于 2013-02-15T14:37:37.350 に答える
1

ただし、それらを公開に設定しましたが、アカウントを個別に扱いたい場合は、それらを非公開にして、それらの変数の「取得/設定」メソッドを使用する必要がありますか?

まず、クラスの各インスタンスは個別の SavingAccount として扱われます。

SavingAccount acct1 = new SavingAccount(....); //represents one Saveing account
SavingAccount acct2 = new SavingAccount(....); //represents another Saveing account

属性が公開または非公開としてマークされているかどうかは問題ではありません。通常、クラスをカプセル化する場合は、属性をプライベートにし、パブリックの getter/setter メソッドを使用して、他のオブジェクトが属性に直接アクセスできないようにします。getter/setter を介してのみアクセスできます。

于 2013-02-15T14:38:56.480 に答える
0

フィールドをData Encapsulation用に非公開にすることをお勧めします。データのカプセル化は、フィールドへのアクセスを制限および制御して、プログラマーによる望ましくないアクションを防止する方法です。そうしないと、プログラマーが制御されていない方法でインスタンスの変数にアクセスしたり変更したりして、問題が発生する可能性があります。言い換えれば、変数へのアクセスを制御すると、物事を壊したりバグを導入したりすることが難しくなります。

基本的に、クラスは「ブラック ボックス」のように機能する必要があります。外部からは、別のプログラマーは内部 (つまりプライベート フィールド) がどのように機能するかを見ることができず、気にもしません。明示的に宣言された操作 (つまり、パブリック メソッド) を使用することによってのみ、ボックスとやり取りできます。これらの操作は、必要に応じて内部を操作します。

もちろん、やりたいことは何でもできます。

于 2013-02-15T14:36:36.877 に答える
0

public フィールドを使用したい場合と使用したくない場合の 2 つの異なるケースを指摘できると思います。

1 つ目は、不変のデータ構造を使用している場合です。不変のデータ構造は、あなたが努力したいものであると私は完全に確信しています。不変構造の長所と短所は、他の場所で見つけることができます。パブリック フィールドに関しては、不変の構造が明らかなことを示唆しています。つまり、すべてのフィールドをパブリックにします。構造は不変なので、値を読み取ることしかできません。この場合、ゲッターはまったく不要で、コードを乱雑にするだけです。

2 つ目は、明らかに可変構造を使用している場合です。この場合、ゲッターとセッターの使用は正当化されます。セッターに何らかのロジックを入れる可能性は十分にあり、ここでデータ フィールドをカプセル化することは必須です。誰かが誤ってデータを変更することは本当に望ましくありません。ただし、変更可能な DTO は悪であり、避けるべきだと思います。それらの使用について私が見る唯一の理由は、Hibernate のようないくつかの API との互換性です。

また、誰にもアクセスさせたくない内部状態を構成するフィールドも非表示にする必要があります。これは、いくつかの動作 (サービス、DAO など) を実現するクラスの場合です。この場合、通常は getter と setter を作成する必要さえありません。

要するに、私は次のアドバイスをします: public フィールドを持つ不変オブジェクトを DTO として使用し、これらの DTO で動作する動作クラスを可能な限り閉じたものにします。

于 2013-02-15T16:16:18.597 に答える
0

変数 public を定義すると、直接アクセス/設定可能になります。
それらをプライベートに定義する場合は、ゲッターとセッターが必要です。

アクセスを制御することが望ましいので、それらを非公開として宣言します。

于 2013-02-15T14:36:51.633 に答える
0

専用にしておくと良いです。私があなたのクラスにアクセスし、以下のように値を設定しているとしましょう。

SavingsAccount sa = new SavingsAccount(12345,25000);

以下のように、オブジェクトを直接使用してバランスを設定できるようになりました。

sa.balance = -300;

sa.ACCOUNT_NUMBER = 6789;

あなたのクラスにはセキュリティが提供されていません。これは、データのカプセル化と呼ばれる OOP の重要な概念です。

于 2013-02-15T14:39:59.203 に答える
0

値を設定するときに何らかの検証を実行しない限り (つまり、残高が負でない場合)、public可能であれば使用してください。

値を返すか割り当てるだけの属性の getter と setter の両方を追加のロジックなしで作成すると、実際には属性が公開さpublicれ、コードが不必要に混乱します (読みやすさの点で)。パブリック属性を直接使用すると、コードがよりきれいになります。

例 1:

*アカウントにプラスの残高のみを許可したい。値を割り当てるたびに、負の値を割り当てているかどうかを確認するためにチェックを実行する必要があります。

これを行うのに最適な場所は、setter メソッドです。if(newBalance < 0)これにより、あちこちに多くのチェックを入れなければならないという問題がなくなります。

正の残高値のみが必要であるという事実を強制するには、属性を にしますprivatebalanceこれにより、属性 (*)に負の値を割り当てたいプログラマーが制限されます。balance 属性内に保持されている値に再度アクセスできるようにするには、プライベート値のゲッターを追加する必要があります。

これで、制限を適用する「ある種の」public属性ができました (ネガティブに設定することはできません)。

例 2:

すべてのアカウントにメモを取りたい。String notes;クラスに属性があります。

強制したい制限がない場合は、public修飾子を使用するのが最善です。

次のコードのどれがよりクリーンかを検討してください。

accountA.setNotes(accountB.getNotes());

また

accountA.notes = accountB.notes;

notesどちらも一方のアカウントから他方のアカウントにコピーされますが、後者の方が読みやすいです。

于 2013-02-15T14:40:15.330 に答える
0

privateの代わりにいくつかのフィールドを設定することを常にお勧めしますpublic
適切な方法を使用してそれらにアクセスすると、きちんとしたコードが提供され、バグが少なくなるからです。
誰かがあなたの口座番号を知りたがっていて、あなたに現金をプレゼントしようとしています。
すぐにあなたに尋ねて、あなたのエアコンを手に入れる人。いいえ、またはあなたが A/C No. を公に発表し、その人はあなたに通知せずに A/C No. を取得します。
最初はそれを作成して/メソッドprivateを使用するようです。 2番目はうまくいくようです。getset
public

于 2013-02-15T14:42:23.797 に答える