如果我直接声明并访问类的属性,会有什么不同?

时间:2011-01-14 06:19:00

标签: java class scope

public class MyData {
    public String id_number,first_name,last_name,age,level;
    public MyData(String raw_string){
        String[] parameters = raw_string.split(",");
        for(int x = 1;x<parameters.length;x++){
            String[] key_val = parameters[x].split("=");
            if(key_val[0].equalsIgnoreCase("ID")){
                id_number = key_val[1];
            }
            if(key_val[0].equalsIgnoreCase("FN")){
                first_name = key_val[1];
            }
            if(key_val[0].equalsIgnoreCase("LN")){
                last_name = key_val[1];
            }
            if(key_val[0].equalsIgnoreCase("AG")){
                age = key_val[1];
            }
            if(key_val[0].equalsIgnoreCase("LV")){
                level = key_val[1];
            }
        }
    }
}

我通常在我的学校项目中声明类似上面的类,现在我一直在编写真实世界的应用程序, 我练习使用get-set方法,理解它只为类本身提供控制。

根据我的理解,声明类似上面的类属性只会导致MyData.name = "Here's a new name for me.";

的意外价值变化

懒惰,我倾向于回到那种做法,因为键入getName();setName("This is my name");太耗费时间(我知道IDE可以加快速度,但仍然......)

更不用说为每个属性编写两个函数(get和set,以及必要的clear())所需的时间。 所以问题是,我真的需要遵守get-set方法吗?

PS:请重新解释我的问题,以反映正确的编程术语(我并没有真正关注课程)。

3 个答案:

答案 0 :(得分:6)

这个问题的答案围绕着良好的编程风格,并且取决于有多少人阅读这个问题,你会得到一些非常愤怒的回答,坚持认为即使提出这个问题也是一种罪过。简短的回答是code encapsulation.

您正在为您的课程编写非常小的程序,并且您正在将它们编写为一组标准,这些标准在任务开始时是众所周知且精确定义的,并且永远不会更改。不幸的是,现实世界中编写的程序很少具有这些属性。它们是大型程序,其设计在程序开始之前并未真正完成(暗示,从未如此),并且它们解决了尚未被充分理解并不断变化的问题。

鉴于这些挑战,以及我还没有提到的更多挑战(其中最大的结果是,一旦你编写代码,你将多次更改代码的许多部分)程序员已经提出了一套实践这使编程更容易忍受。您可以做的最重要的事情之一是隔离程序中的更改。这意味着当您在系统的某个部分更改某些内容时,它应尽可能少地更改系统的其他部分。

封装是帮助您实现此更改隔离的一种方法。如果您决定更改MyData类的重要内容,则必须更改使用MyData的每个类。例如,假设您确定MyData应该比您定义的5个字段多得多,或者MyData存储的字段应该在运行时动态更改。我会通过为MyData提供一个包含所有字符串的私有HashMap来实现这一点,然后可以通过密钥访问它。

在这种情况下,如果您使用了getFirstName(),getLastName()等,那么使用MyData的其他类将不知道有任何改变,并且会继续他们的业务。但是你做事的方式,通过公开数据,每一个都必须进行修改,把几分钟的工作变成值得或更多的日子。 (相信我,像这样的小型工具通常最终被用于很多地方。)

另外,尽量不要卡在我给你的例子上。至少还有其他5个我能想到的例子,所以说这个例子永远不会发生在你身上,或者找到一种不同的方法来解决它,不仅忽略了这一点,而且完全忽略了这一点。

答案 1 :(得分:2)

嗯,这取决于你所说的“需要”。如果您希望最终获得任何程度的封装,则不应暴露公共字段。如果您希望能够更改数据存储方式的实现细节,或者验证字段上设置的任何值等,那么您需要使用属性。

存储的详细信息是实施详细信息。它们不应该影响呼叫者。如果你想在版本之间更改私有变量的名称,那绝对没问题。如果你想从视图的起点和终点存储(比方说)改为存储开始和计数,那很好 - 你可以在不破坏公共API的情况下完成所有这些。

当然,封装比使用属性而不是公共字段的 要多得多,但它是IMO的基本出发点。

强烈敦促你使用属性。

答案 2 :(得分:0)

我完全同意其他答案。但是,大量支持重构的IDE(如Eclipse和IntelliJ)将允许您轻松地将字段访问的属性更改为getter / setter访问(以及更多)。

如果您正在编写将由其他开发人员使用的程序(例如,使用像CVS这样的版本控制),那么最好坚持编写精美的封装getter / setter样式类以避免不必要的重构(导致很多)对于愚蠢的合并冲突)提前。

如果您要在发布更改之前自行工作一段时间并且只想快速完成工作,那么请使用可提高工作效率的样式。在实际将其提供给其他人之前,您可能会对您的程序进行一百万次重构,因此最终版本可能会为您节省一些时间。但这是编程风格的问题。