这两个类都支持封装吗?...?

2024-01-06

public class Normal {
   public string name;     // name is public

   public String getName() {
        return name ;
   }

   public  String setName(String newName) {
         name = newName ;
         return name ;
   }

   public static void main(String args[]) {
      Normal normal = new Normal();
      normal.setName("suhail gupta");
      System.out.println( "My name is : " + normal.getName() );    
  }
 } 

新的班级从这里开始

public class Different {
   private string name;         // name is private

   public String getName() {
        return name ;
   }

   public  String setName(String newName) {
         name = newName ;
         return name ; 
   }

   public static void main(String args[]) {
      Different different = new Different();
      different.setName("suhail gupta");
      System.out.println( "My name is : " + different.getName() );    
  }
 } 

头等舱有name声明为 public 并且其他类已声明名称private。这两个类都执行相同的工作,但只有名称不同的访问说明符。现在,

我的问题是?

  • 这两个类都支持封装吗?如果他们这样做,为什么private优先于public ? (我做了同样的工作,声明name正如我所声明的那样公开private)
  • 哪个类更容易维护?
  • 程序员在上课时会感到轻松refactoring ?
  • How is normal类不同 , 从different class ?
  • 当他们说未封装意味着不可更改 https://stackoverflow.com/questions/6555866/unencapsulated-means-unchangeable,这里怎么是不变的呢?

In "Normal“(这并不“正常”),这是完全合法的代码:

public static void main(String args[]) {
   Normal normal = new Normal();
   normal.name = "suhail gupta";
   System.out.println( "My name is : " + normal.name );    
}

现在你的界面includes a String称为的值name。用户希望能够使用 VarName.name 或 VarName.setName 语法来设置它。用户希望能够使用 VarName.name 或 VarName.getName 检索它;

例如,这在“Normal":

public static void main(String args[]) {
   Normal normal = new Normal();
   normal.name = null;
   String name = normal.name;
   System.out.println( "My name is : " + name );
}

现在,也许你会想“那又怎样?”想象一下,如果将变量设置为 null 与实际打印(发生错误的地方)相隔 30 个文件。很难知道是谁搞砸了该变量的值。还有nothing您可以采取措施防止用户搞砸。

现在,如果你已经实现了setName像这样:

public String setName(String newName) {
   assert newName;
   name = newName ;
   return name ;
}

然后,就会出现错误立即地当用户做错事时。用户尝试将一个不允许为空的值设置为空,因此会出现错误。您有一个调用堆栈,显示错误发生的位置,这更容易调试。

当然,这没有帮助,因为“的用户Normal“ 才不是have to use setName。他们可以自由地戳name直接地。

虽然从技术上讲它可能是封装,但就我而言,如果用户可以轻松且简单地破坏它,那么它就不是封装。如果没有保护,就没有封装。


当他们说 Unencapsulated 意味着 Unchangeable 时,它​​怎么在这里是不可更改的呢?

好吧,假设你给我一个包含以下内容的库Normal。我会以某种方式使用它。也许我有Normal实例分散在 50 个文件中。他们all直接设置并获取名称name而不是访问器。这是完全合法的,因为是你做的public.

现在,无论出于何种原因,您决定不想将名称存储在字符串中。也许您需要能够拥有名字和姓氏。因此,假设您的库的下一个版本具有以下定义:

public class Normal
{
    public string firstName;
    public string lastName;

    public String getName()
    {
        return firstName + " " + lastName;
    }

    public  String setName(String newName)
    {
        //parse newName into a first and last name.
        ...
        firstName = newFirstName;
        lastName = newLastName;
        return getName();
    }
}

少了什么东西?public String name;该功能不再可用,因为您现在有了名字和姓氏。请注意,两个访问器方法没有改变at all.

当我升级到您的库的新版本时,您将只需破坏了我所有的代码。我不希望我的代码仅仅因为您决定更改类中数据的存储方式而被破坏。我现在再也不会使用你制作的任何东西,因为你甚至无法保持界面从一个版本到下一个版本的一致性。

如果你做得正确的话,这一切都不会发生。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

这两个类都支持封装吗?...? 的相关文章

随机推荐

  • 导入错误:无法导入名称应用程序

    我正在尝试按照教程进行操作 But from kivy import App gives ImportError cannot import name App 我怎样才能解决这个问题 我已经安装了kivy 1 8 0和cython 0 20
  • c# - 如果方法运行时间太长,则中止方法的执行

    如果运行时间太长 如何中止方法的执行 e g string foo DoSomethingComplex but if DoSomethingComplex 花费的时间太长 比如说 20 秒 然后只需将 foo 设置为 您可以创建一个运行您
  • Spring MVC:表单标签和命令错误

    我正在使用 Spring 框架进行编程 在处理表单标记中的 jsp 第 2 行 时显示以下错误后 我感到绝望 Error ERROR org springframework web servlet tags form InputTag Ne
  • Now.sh 构建中断的原因是:当前未启用对实验性语法“decorators-legacy”的支持

    预期的 添加后decko 对装饰器的支持 以及添加对experimetalDecoractors in my tsconfig js并使用 babel plugin proposal decorators in 包 json My now
  • 有没有办法在 Svelte 中将 props 声明为可选

    我创建了一些带有可选道具的组件 例如hide true 我的问题是 当我不通过该道具时 这些恼人的错误消息总是充斥着我的控制台
  • 点云生成

    我有一个 3D 几何形状 必须将其转换为点云 所得到的点云可以被认为等同于对象的激光扫描输出的点云 不需要生成网格 生成的点可能是均匀分布的 也可能只是随机分布的 没关系 3D形状可以以3D数学公式的形式提供 这必须使用 MATLAB 来完
  • 从命令行指定 dockerignore

    我有一个 dockerignore 文件 但对于一个用例 我想在命令行指定 dockerignore 的内容 例如 docker build ignore node modules t foo 有没有办法从命令行执行此操作 我在文档中没有看
  • ECMAScript 6:WeakSet 的用途是什么?

    WeakSet 应该通过弱引用来存储元素 也就是说 如果一个对象没有被其他任何东西引用 那么它应该从 WeakSet 中清除 我写了以下测试 var weakset new WeakSet numbers 1 2 3 weakset add
  • 更改 HTML 元素的背景颜色

    我有一张包含 100 多个不同大小和尺寸的几何形状的图像 我在它上面使用了图像映射并为每个分配了 ID area like area 我在 MySQL 数据库中存储了有关每个形状的记录 例如 box id color code 1 AEEE
  • 优化 QtCreator 编译器的配置

    我在 Windows 7 中使用 QtCreator 我想将其配置为使用第三级优化 O3 用于 C 编译器 我怎样才能加快我的代码速度以及需要进行哪些更改 尝试将下一行添加到您的 pro 文件中 remove possible other
  • 为标签栏设置背景图像

    我正在尝试以编程方式设置应用程序中选项卡栏的背景图像 我的代码如下 根视图控制器 h IBOutlet UITabBar mainTabBar IBOutlet UITabBarItem settingsBarItem IBOutlet U
  • 在新的命名空间中定义简单类型,例如 xsd:string?

    这应该是直截了当的 但在我看来 它似乎只包含有关复杂类型的信息 假设我已经定义了一个名称空间xmlns address http 现在 从我读到的内容来看 我似乎可以执行以下操作
  • React useState - 每个组件使用一个状态还是多个状态? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 使用 Hooks Functional 组件来优化 React 并使代码更具可读性的更好方法是什么 每个组件有一个或多个 setState 钩子
  • 拉伸图像以适合 td

    我想在我的 td 单元格中拉伸图像 怎么做 它是一个选项卡图像 看起来像 的倒置 我需要将图像放置在第一个 td 单元格中 其中包含文本 aaa 将位于该图像的中心 如果不使用 CSS3 则无法拉伸背景图像 In CSS3你有背景大小属性
  • 如何解决Jboss部署错误?

    17 19 30 298 ERROR ProfileServiceBootstrap Failed to load profile Summary of incomplete deployments SEE PREVIOUS ERRORS
  • 使用 ObjectInputStream 读入的对象在 try-catch 块后不保留值

    因此 我将 Car 对象数组写入文件 然后当我尝试在 cars 变量中读回它们时 我在语句上设置了它们cars Car in readObject 但是 当我使用调试器单步调试它时 一旦退出 try catch 块 汽车变量就会 取消设置
  • 从命令行获取所有打开的窗口的列表

    在Windows 7中 是否可以从命令行获取所有打开的桌面窗口的列表 我知道有可能获得所有正在运行的进程的列表 https stackoverflow com questions 53489 how do you list all proc
  • 如何恢复已删除的 Facebook 应用程序?

    我的一位管理员已删除该应用程序 有什么办法可以恢复吗 我如何联系 Facebook 的开发人员 您可以通过进入您的开发者帐户请求来恢复已删除的 Facebook 应用程序 https developers facebook com appe
  • 如何解决“链接器命令失败,退出代码 1”问题?

    我正在尝试使用OMPTrace这是一个追踪和可视化的工具OpenMP程序执行如下所示https github com passlab omptrace https github com passlab omptrace 中给出的代码exam
  • 这两个类都支持封装吗?...?

    public class Normal public string name name is public public String getName return name public String setName String new