2013-02-15 51 views
1

以下是我作为课堂练习所做的Java代码。我有一个名为SavingsAccount的类。它有平衡和利益变量。但是,我将它们设置为公开,但是如果我想单独处理这些帐户,是否需要将它们设置为私有,并为这些变量设置“获取/设置”方法?我能否公开让变量公开?其余的代码都有使用这些变量进行计算的方法。Public vs Private

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; 
    } 
+1

“单独处理帐户”与帐户数据的访问方式无关。 – 2013-02-15 14:37:14

+0

我可以问为什么这是低票?我想了解更多关于封装。 – SndLt 2013-02-15 14:39:42

+0

我举了一个示例代码验证示例。这篇文章没有一个例子。但是没问题。 – SndLt 2013-02-15 14:41:43

回答

1

然而,我将它们设置为公开,但如果我想治疗的账户 独立,做我需要让他们私享“的get/set” 方法为这些变量?

首先,您的类的每个实例被视为一个单独的SavingAccount。

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

如果您的属性被标记为公开或私人,这并不重要。通常如果你想封装你的类,你的属性是私有的,并且有公共的getter/setter方法,这样其他对象不能直接访问你的属性。他们只能通过getter/setter访问它们。

0

它是一个好主意,使私营领域为数据封装。数据封装是限制和控制对字段的访问以防止程序员采取不必要的行为的做法。如果你不这样做,程序员可能以不受控制的方式访问或更改实例上的变量,这可能会破坏事物。换句话说,控制对变量的访问会使事情难以分解并引入错误。

基本上,你的课程应该像一个“黑匣子”。从外部看,另一个程序员看不到,也不关心内部(即私人领域)是如何工作的。您只能使用显式声明的操作(即公共方法)与框进行交互。这些操作将根据需要操纵内部。

当然,你可以做任何你想做的事情。

0

如果你定义变量public,它们可以直接访问/设置。
如果你将它们定义为私有的,你需要getters和setter。

控制访问是可取的,声明它们是私人的。

6

你当然可以变量作为公共但也有很多人在这里谁也追捕你为...
这是encapsulation于二OO范式的问题。一般来说,物体不应该捅到彼此的内部。

+2

使会员尽可能私密,并根据需要公开。 – 2013-02-15 14:38:33

+0

+1,这是你的世纪.. :) – PermGenError 2013-02-15 15:37:34

0

它很好,它使私人。假设我正在访问您的课程并设置如下的值。

SavingsAccount sa = new SavingsAccount(12345,25000);

我现在可以使用该对象直接设置了平衡,如下所示:

sa.balance = -300;

sa。ACCOUNT_NUMBER = 6789;

班上没有提供任何安全保障。这是OOP中称为数据封装的重要概念。

0

除非您在设置值(即余额不为负数)时执行某种验证,否则请尽可能使用public

为仅仅返回或分配一个值的属性创建getter和setter,而没有额外的逻辑,实际上将您的属性公开为public,并为代码提供了不必要的混乱(就可读性而言)。直接使用公共属性会使代码更清晰。

例1:

*您希望允许一个账户只能有积极的平衡。您必须执行检查,以确定每次为其分配值时是否为其分配负值。

要做到这一点的最好的地方是在一个setter方法。这让你摆脱了不得不在整个地方投入大量if(newBalance < 0)支票的麻烦。

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

您现在拥有一个public属性的“某种”,您在其上强制执行限制(不能设置为负值)。

例2:

你要采取每个帐户的笔记。您的班级中将有String notes;属性。

如果没有要强制执行的限制,最好在此使用public修饰符。

考虑以下哪些代码块是清洁:

accountA.setNotes(accountB.getNotes()); 

accountA.notes = accountB.notes; 

他们都从一个帐户复制notes给对方,但后者更容易阅读。

+0

你的领域不应该公开,除非绝对必要 – 2013-02-15 14:46:17

+0

同意 - 这违背了面向对象的概念。 – 2013-02-15 14:47:13

+1

-1 - 使用访问器和增变器的想法是让你稍后改变实现,而不需要更新一堆其他代码。例如,我可以改变一个简单的setter来包含验证。或者我可以改变一个吸气剂不再返回私人领域,而是执行计算。我会说“混乱”是值得的,特别是因为大多数IDE会为你生成这个代码。 – 2013-02-15 14:48:13

0

总是建议设置一些字段private而不是public
因为使用适当的方法来访问它们提供了整洁的代码和更少的错误。
想想你自己,有人想知道你的帐号,以现金的方式给你一个礼物。
你会更喜欢哪一个人要求你及时获得你的A/C。否或您公开宣布您的账户号码,并且该人在未通知您的情况下获得账号。
第一个似乎使它private和使用get/set方法。
第二个似乎使它public

0

我认为有可能指出两个不同的情况,你想要什么,你不想使用公共领域。

第一个是你使用不可变数据结构的时候。我完全相信,不变的数据结构是你想要努力的。不可变结构的优点和缺点可以在别处找到;关于公共领域,不可变结构提出了显而易见的问题 - 公开所有领域。那么,结构是不可变的,所以你只能读取值。在这种情况下,getter是完全不必要的,只会让代码混乱。

而第二个显然是当你使用可变结构。在这种情况下,使用getter和setter是合理的;你完全有可能将一些逻辑放在setter中,并且在这里封装数据字段是必须的:你真的不希望有人不小心改变你的数据。不过,我认为可变DTOs是邪恶的,应该避免;我看到他们使用的唯一原因是与Hibernate等一些API兼容。

你也应该隐藏字段,当他们包含你不想让任何人访问的内部状态。类实现一些行为(服务,DAO等)就是这种情况。在这种情况下,你通常不希望创建getter和setter。简而言之,我会给出以下建议:使用带有公有字段的不可变对象作为DTO,并使这些DTO上的行为类尽可能地关闭。

相关问题