java - 如果我直接声明并访问类的属性有什么区别?

标签 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:请重新表述我的问题以反射(reflect)正确的编程术语(我并没有真正关注类(class))。

最佳答案

这个问题的答案围绕着良好的编程风格,并且根据有多少人读到这个问题,你会得到很多非常愤怒的回应,他们坚持认为即使问这个问题也是一种罪过。简短的答案是 code encapsulation.

您正在为您的类(class)编写非常小的程序,并且您正在按照一组众所周知的标准编写它们,这些标准在作业开始时就被精确定义,并且永远不会改变。不幸的是,现实世界中编写的程序很少具有这些属性。它们是大型程序,其设计只有在程序完成后才真正完成(提示,这永远不会),并且它们解决的问题尚未被很好地理解并不断变化。

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

封装是帮助您实现更改隔离的一种方法。如果您决定对 MyData 类进行重大更改,则必须更改使用 MyData 的每个类。例如,假设您决定 MyData 应该保存比您定义的 5 个字段多得多的字段,或者 MyData 存储的字段应该在运行时动态更改。我将通过为 MyData 提供一个包含所有字符串的私有(private) HashMap 来实现此目的,然后可以通过 key 访问这些字符串。

在这种情况下,如果您使用了 getFirstName()、getLastName() 等,则使用 MyData 的其他类将不知道发生了什么变化,并且将继续其业务。但你做事的方式,通过公开数据,每一个数据都必须修改,将几分钟的工作变成一天或更长时间的工作。 (相信我,像这样的小型实用程序通常最终会在很多地方使用。)

另外,尽量不要陷入我给你的例子中。我至少还能想到 5 个其他例子,所以说这个例子永远不会发生在你身上,或者寻找不同的方法来解决它,不仅没有捕获重点,而且完全没有捕获重点。

关于java - 如果我直接声明并访问类的属性有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4688479/

相关文章:

java - 在 Java 中测试两个 JSON 对象的相等性并忽略子顺序

java - Android 正则表达式总是返回 false

java - 大批?参数数组?

java - 关于用 Java 在 JLabel 中写入数字的问题?

javascript - JavaScript 行为的范围

C++ 类声明和命名空间

class - PHP>无法按功能嵌入youtube视频

java - 我有一个包含菜单项属性的类。我需要填充三个 JList。我怎样才能这样做呢?

c++ - 在同一函数中引用范围外的局部变量是否可以?

c# - 为什么我得到 "The name x does not exist in the current context"?