0 0

java方法 按照引用传递一个对象,怎样避免修改对象内容10

比如说一个java Bean
public class UserDto{
   private TableDto table;
   private KnifeDto knife;
   ……
}
方法 changeDto(UserDto userDto){

}
比如我只想在方法里面修改table,并不想对里面的knife进行修改。为了防止knife的内容被修改。应该怎么办??? 

问题补充:用final去定义的话,则无论何时都不能修改了,只是为了限制在changeDto此方法不能修改(set),其它方法可以允许set。怎么办??


问题补充:
robertliudeqiang 写道
引用
java方法 按照引用传递一个对象,怎样避免修改对象内容


根据“effective java”,标准的方法是把对象实现成一个"immutable object",这样,调用改对象的任何方法都不会改变对象的状态,一般是生产一个新的对象。




不是不允许修改  是在某些方法不允许修改  有些方法允许修改
这样怎么弄  用clone的思路和步骤是什么?能否详细解答一下呢?



2010年3月20日 20:57

9个答案 按时间排序 按投票排序

0 0

对这两个变量均不提供set方法  
   private TableDto table;
   private KnifeDto knife;

仅仅提供get方法
因为get提供的是引用 所以table和knife的内容还是可以修改的

而针对lz"某些方法可以修改 某些方法不可以修改"的需求
可以在TableDto类型内部的方法进行控制
针对某些方法则进行修改,而另一些不具备权限的方法则直接返回~

2010年3月22日 16:55
0 0

另外,java里不建议直接使用clone的,这个方法有很多局限性,具体原因可以参考"effective java"

2010年3月21日 14:31
0 0

引用
用clone的思路和步骤是什么?能否详细解答一下呢?


可以使用拷贝构造器(copy constructor), 在不允许修改对象内部状态的方法里为当前对象生成一个拷贝构造。

可以参考
http://www.javapractices.com/topic/TopicAction.do?Id=12

2010年3月21日 14:30
0 0

你的需求算是了解了,
你是想在某些方法不允许修改  有些方法允许修改 ,

那你可以针对那些方法进行aop代理,设置哪些方法可访问,哪些方法访问就抛异常

可参考aop实现
http://robert.blog.51cto.com/374512/83040

2010年3月21日 10:45
0 0

引用
java方法 按照引用传递一个对象,怎样避免修改对象内容


根据“effective java”,标准的方法是把对象实现成一个"immutable object",这样,调用改对象的任何方法都不会改变对象的状态,一般是生产一个新的对象。

2010年3月21日 07:28
0 0

楼主的意思应该是knife里面的属性不能变吧

所以
1. final是不管用的
2. 保证UserDto 不能更改 knife的引用
3. knife的属性不被更改(可以不提供set方法)或者 当别的地方想要用knife的时候,程序可以clone一个出来

2010年3月20日 21:46
0 0

好像也不行


估计得在传值前,再封装那个对像,
把UserDto里的
table提供GET,SET方法

knife只提供GET方法

public class UserDtowrap{ 
   private TableDto table; 
   private KnifeDto knife; 
   …… 
} 

main(){
UserDto _u

UserDtowrap _uw = new UserDtowrap(_u);

changeDto(_uw);

}

changeDto(UserDtowrap userDto){ 

} 



或者用拦劫 方法,(但个人觉得没做成像SPRING配置那样,这个更麻烦)

2010年3月20日 21:10
0 0

UserDto 不要提供set 属性的方法

2010年3月20日 21:06
0 0

传用final 定义的 数据。。。。

2010年3月20日 21:02

相关推荐

    Java:按值传递还是按引用传递详细解说

    综上所述,在Java中,对于基本数据类型的参数传递实际上是按值传递,而对于对象类型的参数传递则是按引用传递的一种特殊形式——传递的是对象引用的副本,但由于这些副本指向同一个对象,因此对对象的修改会影响到...

    Java面向对象值传递和引用传递

    Java 面向对象值传递和引用传递 Java 面向对象编程中,参数传递是非常重要的一个概念。参数传递有两种方式:值传递和引用传递。了解这两种方式的区别是非常重要的,因为它们对程序的执行结果产生了很大的影响。 值...

    Java-Java面向对象中引用传递教程

    在Java编程语言中,面向对象特性是其核心概念之一,其中引用来传递对象是一个非常重要的知识点。本教程将深入探讨Java中的引用传递机制,并通过视频教程的形式帮助学习者更好地理解和应用这一概念。 首先,理解...

    Java是值传递,传对象引用也是通过值

    例如,可以使用Java的`System.identityHashCode()`方法来验证不同引用是否指向同一个对象,或者使用调试器来查看方法调用时的实际参数传递。 总的来说,理解Java中的值传递和对象引用传递对于编写高效、无误的代码...

    java 值传递和引用传递的比较

    因此,当在方法内修改对象的属性`value`时,会影响到原始对象,因为两个引用都指向同一个内存位置。 值传递和引用传递的主要区别在于: 1. 变量的修改:值传递的参数在方法内部的任何修改都不会影响原始变量;引用...

    java值传递与引用传递

    然而,这里有一个关键点需要注意,Java并不支持真正的引用传递,而是使用"传对象的引用副本"来模拟引用传递的效果。 ```java class Box { int value; public void setValue(int val) { this.value = val; } } ...

    java中对象和对象引用的区别!

    在Java中,“=”符号并不意味着两个对象之间的赋值,而是一个指向对象地址的传递。例如: ```java A a3 = new A(); A a4 = new A(); a3 = a4; // 此时a3和a4都指向同一个由new A()创建的对象 ``` 这里需要...

    Java基础:对象及引用祥解

    ` 方法中对`s`的修改会影响原始`sMain`所指向的对象,因为它们指向同一个对象。 #### 四、案例分析 为了更好地理解这些概念,我们可以分析给定代码示例中的几个关键部分: 1. **基本类型参数传递**:在`...

    java按值传递还是按引用传递详细解说

    实际上,Java通过传递对象引用的方式,实现了类似引用传递的效果。以下是对这两种传递方式的详细解释。 1. 按值传递 按值传递是指在函数调用时,实际传递的是参数变量的副本,而不是原始变量本身。这意味着在函数...

    java对象和对象的引用之间的关系

    这意味着对于引用类型的参数,如果在方法内部修改了引用所指向的对象,那么这些更改会影响到原始对象。 综上所述,理解Java中对象与引用之间的关系对于有效地使用面向对象编程至关重要。通过明确区分对象和引用,并...

    浅析Java引用类型和方法参数传递

    - **分析**:尽管 `str1` 是一个引用类型,但由于 `String` 类是不可变的,所以即使 `change` 方法尝试修改 `str2`,也只是创建了一个新的 `String` 对象,并未改变 `str1` 指向的对象。 #### 五、结论 - Java中的...

    23.Java对象作为参数传递是传值还是传引用1

    许多人认为对象是按引用传递,而实际上,Java总是按值传递,包括对象。这里的“值”指的是对象的引用,而不是对象本身。这与C++或C#等其他语言中对象的传递方式有所不同。 首先,我们需要理解Java中的引用概念。当...

    jni java传递对象到C

    在Java编程中,JNI(Java Native Interface)是一个关键的组件,它允许Java代码与其他语言(如C和C++)进行交互。当我们需要高效地处理数据、利用特定平台的库或者优化性能时,JNI就显得尤为重要。本文将深入探讨...

    面向对象语言中的值传递与引用传递

    由于是引用传递,`b`和`a_book`都是指向同一个对象的引用,因此在方法调用之后,`b`对象的值发生了变化。 总结来说,值传递和引用传递是Java中处理参数传递的两种机制。理解这两者的差异对于正确处理方法调用和对象...

    Java对象及其引用的理解

    在Java中,所有的参数传递都是按值传递,这意味着当我们将一个变量作为参数传递给方法时,实际传递的是该变量的副本,而不是变量本身。因此,对于基本类型(如int,double等),方法内部对参数的修改不会影响到外部...

    Java的引用和函数参数传递

    - **引用传递的本质**:Java中的引用传递本质上是传递对象的引用,而不是对象本身。这意味着在方法内部对对象所做的任何改变都会影响到原始对象。 - **引用与值的区别**:与基本类型的值传递不同,引用传递不会创建...

    java参数传递时到底是值传递还是引用传递[归类].pdf

    Java的参数传递方式实际上是一种特殊的"值传递",通常被称为"按引用传递对象的引用",这与C++等语言中的引用传递有所不同。以下是对这个主题的详细解释。 在Java中,所有的参数传递都是基于值的,但这涉及到一个...

    java中的引用问题

    - Java中的`String`类是不可变的,这意味着一旦创建了一个`String`对象,就不能更改它的内容。因此,当我们传递`String`对象作为参数时,看起来像是按值传递。例如,如果在方法中创建了一个新的`String`对象,这...

    java值传递和引用传递详解

    Java中的参数传递方式主要有两种:值传递和引用传递。理解这两种机制是编程中至关重要的,因为它们直接影响到函数内部如何改变或操作传入的数据。 **值传递**在Java中是基本数据类型(如int, double, char等)的...

    JAVA【第5章:面向对象基础】_引用传递及其应用.rar

    而在Java中,由于没有真正的引用传递,实际上所有的对象参数都是通过引用传递的,也就是说,传递的是对象在内存中的地址,而不是对象本身的一个副本。这意味着当一个对象作为参数传递给方法时,方法可以访问并修改该...

Global site tag (gtag.js) - Google Analytics