当前位置: 首页 > 知识库问答 >
问题:

在没有getters的情况下访问Model类的私有变量

温嘉赐
2023-03-14

我在项目中定义了一个模型类。和往常一样,它有一些私有变量和公共的获取者和设置者

public class Person{

 private ArrayList<String> mark;

 public void setMark(ArrayList<String> mark){
  this.mark = mark;
 }

 public void getMark(){
  return this.mark;
 }
}

假设在其他类中我使用这个模型,就像

Person person = new Person();
ArrayList<String> mark = new ArrayList();
mark.add("10");
mark.add("15");
mark.add("18");
person.setMark();

然后person的私有变量保存值“my name”,我使用类的public getter访问变量,如

ArrayList<String> localMark = person.getMark()

所以据我所知的人。getMark()返回私有变量名的引用,因此如果我修改局部变量“localMark”,它将影响Person类的私有变量,因此它会破坏变量的私有属性

前任:

 ArrayList<String> localMark = person.getMark();
 System.out.println(localMark.get(0)); // will be "10"
 localMark.set(0,"25") // person.mark will be changed
 System.out.println(person.getMark().get(0)); //will be printing "25"

我猜大多数开发人员都遵循相同的设计模式,但创建模型的正确方法是什么

编辑

根据我检查过的vinod的注释和字符串,它传递的是值,但不是引用,而是ArrayList。。。它返回引用。

共有2个答案

呼延珂
2023-03-14

如果通过调用get()公开的实例是可变的,那么您在其他地方所做的任何更改都将反映在使用它的任何地方的实例中。

例子:

methodX classA - 
 List<String> locaNamesList = person.getNamesList();
 locaNamesList.clear();

Somewhere else
methodY classB -
List<String> locaNamesList = person.getNamesList(); // note the same person instance should be used.
//locaNamesList will be empty here

仅仅重新分配引用不会改变任何事情。

List<String> locaNamesList = person.getNamesList();
locaNamesList = null; // won't change the actual list. You are setting local field locaNamesList to null and not the actual instance.

如果不希望外部玩家更改原始实例(前提是不能使实例本身不可变),则必须使用可变实例的防御副本,并将其传递给其他玩家

蒋嘉颖
2023-03-14

您有一个对象实例的引用(名称)(名称的值)。由于参考资料是私人的,你完全可以控制它。

当您返回引用时,实际上是“按值”返回它,这意味着将返回引用的副本。两个引用都指向相同的值(字符串实例)。

获取引用的外部调用方可以指定一个新值,但模型自身的引用不受此影响,仍然指向该值。

它就像一只拴在皮带上的狗(物体)。

  • 当你回复一条推荐信时,你就是在给同一条狗换一条新皮带
 类似资料:
  • 问题内容: 我试图将配置(例如URLs / etc)放入资源文件夹中,以供实用程序类使用。但是,我不想从任何地方的活动中传递上下文。我希望能够通过路径名(似乎使用assess /是为此用途设计的)来访问资源,而无需使用上下文来访问资源。 在这种特殊情况下,我希望单例实例化时在配置中使用某些东西。除了实例化期间的那一次之外,它不需要任何资源。因此,每次调用getInstance()时都必须传递Con

  • 问题内容: 我可以在没有jQuery的情况下访问数据属性吗? 使用jQuery很容易,但是如果没有jQuery,我在任何地方都看不到该怎么做。 如果我在Google上搜索“没有jQuery”,那么我得到的只是jQuery示例。 可能吗 问题答案: 在这里,我找到了这个例子: 因此,它看起来非常可行。

  • 问题内容: 当然,这个问题可能不是树莓派所特有的。另外,我对Linux还比较陌生。 我想编写一个小库(在node.js中,如果有关系的话),以使用sysfs访问树莓派的GPIO。但是,访问sysfs需要sudo访问,这很明显是有原因的。 Quick2Wire似乎有解决方案,但我想更好地理解它,而不仅仅是盲目使用。他们当然使用了C,但是据我了解,代码并不复杂,即使不那么优雅,也可以仅使用bash即可

  • 我有一个使用webhdfs管理HDFS的工作应用程序。我需要能够在Kerberos安全集群上执行此操作。 问题是,没有库或扩展来协商我的应用程序的票,我只有一个基本的HTTP客户端。 是否可以创建一个Java服务来处理票证交换,并且一旦它获得服务票证,就将其传递给应用程序以在HTTP请求中使用?换句话说,我的应用程序会要求Java服务协商票证,它会将服务票证以字符串或原始字符串的形式返回给我的应用

  • 我不想再使用powermock了。因为junit5开始模拟静态类。因此,我试图摆脱powermock方法。 当我使用PowerMock时,我可以很容易地发现一个具有私有构造函数的类,然后我调用静态方法。 这是我代码的一部分(当我使用PowerMock时) 在我做了MessageValidationUtils.class的间谍对象后,我正在测试这个: 经过一些研究,我找不到任何与监视一个具有私有构造