2010-06-17 80 views
0

什么时候在班级的各种方法中使用专用字段时应该认为是危险的?我主要是创建变量并将其设置为默认值,如null。然后在我的方法中引用它并将其设置为方法中该对象类型的一个实例。何时不使用私人领域?

我不知道我的问题是否有意义,但让我知道如果它不,我会澄清。

+0

请举个例子。拥有经常在课堂上使用的私人领域并不奇怪。目前还不清楚你的意思,“我主要是创建变量并将其设置为默认值,如null。”理想情况下,字段在构造函数中初始化为有效值,所以类不变总是成立。 – 2010-06-17 21:04:26

+1

你问是否可以在一个函数内设置私有字段? – Brandi 2010-06-17 21:16:58

+0

我正在谈论你在你的类的顶部声明的私有字段,该类的作用域仅限于该类,并且该类只是一个类的典型私有字段,而且这些字段是从该类中的各种方法引用的。有些情况下,你不应该使用很多这样的类作用域,因为它可能导致冲突的变化,并且方法将引用具有不稳定值的字段,因为其他方法可能会在它到达另一个之前将其更改。 – PositiveGuy 2010-07-20 01:17:20

回答

2

一般来说,如果你去各地使用字段在你的类就应该私人的,但经常可以是在许多地方被管理的代码气味信号的状态。

本身并不差,但在这种情况下复杂性可能会迅速增长。

+0

是的我不是在谈论全局...只有私人领域。 – PositiveGuy 2010-06-17 21:05:14

+0

@coffeeaddict,但它听起来像你正在使用私有字段,其中本地变量也会同样如此。这绝对是一种代码味道......不好的一个。 – 2010-06-17 21:09:57

+0

这取决于,你将有一些在你的班级的顶部可以重复使用... ...并非所有的变量都是本地的,但最多的是。我发现我可以在我的类的顶部重用2-3个字段,例如表示由构造函数设置的单例,然后在需要它的方法中重用该字段,因为该单例不会更改...它是单身。我班有几种方法需要它......没什么大不了的。没有理由通过它需要它的每种方法的参数。 – PositiveGuy 2010-07-20 01:23:41

4

如果你只需要一个方法内的成员,那么就更喜欢使它成为局部变量而不是成员。变量越局部,理解程序就越容易。

如果需要在多个调用中使用相同的对象,则可以考虑是否可以将该成员设置为只读并在构造函数中进行设置。

+0

如果你没有在构造函数中设置它,那么该怎么办...意味着你的类中的一个方法有设置它的逻辑,并且你想让它保持设置的方法。 – PositiveGuy 2010-07-20 01:22:10

0

如果变量包含敏感数据,您应该意识到它仍然可以从外部通过反射访问。

否则,如果你可以避免私人领域,你不应该使用一个。如果你不能,如果使用正确,本地域没有任何问题。

这是一个坏主意:

public class Calculator() 
{ 
    private int result; 

    public int Add(int a, int b) 
    { 
     result = a + b; 
     return result; 
    } 
} 

,因为你可以得到一个竞争条件,如果两个线程调用Add()方法,在同一时间,第一个线程设置后的结果上下文切换到第二个线程设置结果,两个调用都返回第二个值。

这些错误很难调试,因为它们是完全随机的。

+0

是的,但是如果我使用所有的本地语言,那么当对象可以被重用时,我将不得不重新创建对象的实例。 – PositiveGuy 2010-07-20 01:26:10

+0

当然,但这只是一个竞争条件的简单例子。正如我写的:如果有意义,使用本地字段是可以的。重复使用对象是使用本地字段的一个很好的理由。 – 2010-07-20 14:55:12