1

以下是我作为课程练习所做的 Java 代码。我有一个名为 SavingsAccount 的类。它有余额和利息变量。但是,我将它们设置为公开,但如果我想单独处理帐户,是否需要将它们设为私有并为这些变量提供“get/set”方法?我可以不公开变量吗?其余代码具有使用这些变量进行计算的方法。

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

但是,我将它们设置为公开,但如果我想单独处理帐户,是否需要将它们设为私有并为这些变量提供“get/set”方法?

首先,您的类的每个实例都被视为一个单独的 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,则它们可以直接访问/设置。
如果将它们定义为私有,则需要 getter 和 setter。

控制访问是可取的,将它们声明为私有。

于 2013-02-15T14:36:51.633 回答
0

将其设为私有很好。假设我正在访问您的课程并设置如下值。

SavingsAccount sa = 新的 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)在各处进行大量检查的麻烦。

要强制执行您只需要正余额值这一事实,请创建属性private。这限制了可能想要为balance属性 (*) 分配负值的程序员。为了使 balance 属性中保存的值再次可访问,您需要为私有值添加一个 getter。

您现在拥有“某种”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 号,而该人在不通知您的情况下自己获得 A/C 号。
第一个似乎使它private和使用get/set方法。
第二个似乎成功了public

于 2013-02-15T14:42:23.797 回答
0

我认为可以指出两种不同的情况,你想要和不想使用公共字段。

第一个是当您使用不可变数据结构时。我完全相信不可变数据结构是您想要努力实现的目标。不可变结构的优缺点可以在其他地方找到;关于公共领域,不可变结构暗示了显而易见的事情 - 将所有领域公开。好吧,结构是不可变的,所以你只能读取值。在这种情况下,getter 是完全没有必要的,只会弄乱你的代码。

显然,第二个是当您使用可变结构时。在这种情况下,使用 getter 和 setter 是合理的;您完全有可能将一些逻辑放入设置器中,并且在这里封装数据字段是必须的:您真的不希望有人意外更改您的数据。但是,我认为可变 DTO 是邪恶的,应该避免。我看到它们使用的唯一原因是与某些 API(如 Hibernate)的兼容性。

当它们包含您不希望任何人访问的内部状态时,您还应该隐藏字段。实现某些行为(服务、DAO 等)的类就是这种情况。在这种情况下,您通常甚至不想创建 getter 和 setter。

所以,简而言之,我会给出以下建议:使用具有公共字段的不可变对象作为您的 DTO,并使在这些 DTO 上工作的行为类尽可能封闭。

于 2013-02-15T16:16:18.597 回答