公共与私人

时间:2013-02-15 14:34:43

标签: java private public

以下是我作为课程练习的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;
    }

8 个答案:

答案 0 :(得分:6)

你当然可以将变量公之于众,但这里有很多人会为此寻找你...... 这是OO范式中encapsulation的问题。一般来说,物体不应该捅到对方的内脏。

答案 1 :(得分:1)

  

但是,我将它们设置为公开,但是如果我想要处理帐户   个别地,我是否需要将它们设为私有并且“获取/设置”   那些变量的方法?

首先,您的班级的每个实例都被视为单独的SavingAccount。

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

如果您的属性标记为公共或私有,则无关紧要。通常,如果您想封装您的类,则将属性设为私有,并使用公共getter / setter方法,以便其他对象无法直接访问您的属性。他们只能通过getter / setter访问它们。

答案 2 :(得分:0)

将字段设为私有数据封装是一个好主意。数据封装是限制和控制对字段的访问以防止程序员执行不良操作的做法。如果你不这样做,程序员可能会以不受控制的方式访问或更改实例上的变量,这可能会破坏事物。换句话说,控制对变量的访问会使分解和引入错误变得更加困难。

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

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

SavingsAccount sa = new SavingsAccount(12345,25000);

现在我可以直接使用对象设置我的余额,如下所示:

sa.balance = -300;

sa.ACCOUNT_NUMBER = 6789;

您的班级没有提供任何安全措施。这是OOP中称为数据封装的重要概念。

答案 5 :(得分: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从一个帐户复制到另一个帐户,但后者更容易阅读。

答案 6 :(得分:0)

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

答案 7 :(得分:0)

我认为可以指出您想要的两个不同情况以及您不希望使用公共字段的位置。

第一个是当你使用不可变数据结构时。我完全相信不可变数据结构是你想要努力的。不可变结构的利弊可以在其他地方找到;关于公共领域不可变结构表明显而易见的事情 - 使所有领域公开。好吧,结构是不可变的,所以你只能读取值。在这种情况下,getter完全没必要,只会使你的代码混乱。

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

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

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