Java中引用可变对象的问题

Java中关于返回引用可变对象常见问题剖析 前言在工程中,我们创建了一个类,经常包含一些可变类的对象实例,当我们需要提取这些数据的时候,需要格外注意,否则会出一些意料之外的问题正文名词解释可变对象:类中有方法可以改变其对象的类 举例假设我们有一个example类,其中为Date类创建了一个实体birthday,在外部需要知道某个example类实例的birthday值时,会使用到getBirthday()方法,通常我们的getBirthday 阅读详情

注意:

  不要编写返回引用可变对象的访问器方法。在Employee 类中就违反了这个设计原则,其中的getHireDay方法返回一个Date类对象。

class Employee{
  private Date hireDay;
  public Date getHireDay(){
      Return hireDay;
  } 
}

LoaclDate 类没有更改器方法,与之不同,Date类有一个更改器方法setTime,可以在这里进行毫秒数。

Date对象是可变的,这一点就违反了封装性!如下:

Employee harry =  .... ;
Date d = harry.getHireDay();
Double time = .....;
d.setTime(d.getTime()-( long )time);

这里的程序会报错,原因是d和harry.hireDay 引用了同一个变量,对d调用更改器的方法就可以自动改变这个对象的私有状态,即访问并改变了对象harry的私有域,这在Java中是不允许的。

      如果需要返回一个可变对象的引用,应该首先对它进行克隆,对象clone是指存放在另一个位置上的对象副本。

class Employee{
   public Date getHireDay(){
      return (Date) hireDay.clone();
   }
}

    如果需要返回一个可变数据域的拷贝,就应该使用clone 。

     


Java参数传递机制:值传递与引用传递的常见误解 本文详细解析了Java的参数传递机制,澄清了常见的误解。Java严格采用值传递,对基本类型传递值副本,对引用类型传递对象引用的副本。通过代码示例和内存模型分析,文章展示了基本类型修改不影响原值,而引用类型修改会影响原对象内容但不改变原始引用。文章还对比了不同语言的参数传递方式,分析了字符串和集合类等复杂场景,强调不可变对象的特殊行为。最终结论是:Java始终是值传递,理解这一机制对避免程序错误至关重要。 阅读详情

相关推荐

8.5/Q1,Charls最新高分文章解读!

8 257名受试者中,672人(8.14%)在9年内发生过卒中。在调整的多因素cox回归模型中,TyG和ABSI仍然是卒中的预测因素,TyG的HR为1.25(95%CI:1.06~1.47),ABSI的HR为1.33(95%CI:1.06~1.68)。TyG和ABSI联合诊断效能最高(AUC:0.579,95%CI:0.553~0.597),而TyG(AUC:0.566,95%CI:0.544~0.587)和ABSI(AUC:0.533,95%CI:0.524~0.597)的诊断效能最低。

gsky_sci的博客 1016

Java不可编写返回引用可变对象的访问器方法

问题: 使用java进行编程时,有时会发现在一个类中明明定义的是private类型,结果却能够在其他类中被修改。 代码: class Employee { private String name; private double salary; private Date hireDay; public Date getHireDay(){ return hireDay; }

m0_37620545的博客 1591

开源大模型推理GPU资源评估以及优化

随着大模型的火热很多项目中都使用到了开源大模型,这时候准确评估大模型的GPU资源非常重要,主要有下面几个方面:GPU是昂贵的资源。高估内存需求可能导致在硬件上的不必要支出,而低估则可能导致系统故障或性能下降。:适当的内存管理确保模型高效运行,能够更快地响应用户并处理更多并发请求。:随着需求的增长,理解内存需求对于在不牺牲性能或产生高昂成本的情况下扩展服务至关重要。尽管其重要性显而易见,但计算用于服务大型语言模型(LLM)的GPU内存并不简单。

优快云DN的博客 3117

解决恶意代码,可以通过返回对可变对象的引用来公开内部表示

属性的副本,这样外部修改副本不会影响内部状态。属性,从而避免了直接返回对可变对象的引用。这样外部就只能通过访问器方法来修改。在这个示例中,我们没有直接返回。对象,这样外部就无法修改。,其中有一个可变属性。,我们希望在外部访问。时不会影响内部状态。方法返回一个不可变的。

weixin_45332660的博客 415

【知识点总结】电路原理 第一讲

大家好,从今天起,我将开始更新自上大学以来所学到的各种知识,之所以选择更新它们是因为最近我一直在收拾整理自己自上大学以来所收获到的各种知识,看着那厚厚一沓的书本心里不由得犯愁。如果我想找到特定的知识,那岂不是得翻到猴年马月。俗话说得好,下雨天打鞋子,闲着也是闲着,为此我设置一个专栏,将知识点一一分类总结,目的在于更好的整理所学的知识。本人学艺不精,有一些知识点地方可能存在瑕疵,希望各位大佬可以多多指教。以下是本篇文章正文内容虚断:一般通用性运算放大器的正反向输入端之间的电阻非常非常的大。

weixin_51130221的博客 4万+

冗余位技术在SAR ADC中的动态误差恢复机制解析

本文深入解析了冗余位技术在SAR ADC中的动态误差恢复机制,详细介绍了其基本概念、动态误差产生原因及冗余位的容错空间设计、时序松弛策略和数字校正算法。通过实际电路设计案例和数学建模,展示了冗余位技术如何显著提升ADC的精度和能效比,同时探讨了未来发展方向。

weixin_28335283的博客 975

关于返回引用可变对象

注意:不要编写返回可变对象引用的get方法。 可变对象:可变对象:类中有方法可以改变其对象实例域(数据域)的类 举例: class Example{ private Date birthday; … public Date getBirthday{ //BAD return birthday; } … } 当获取一个Date类的实例date时,可以由date来修改实例变量。这样就会破坏封装性,如果要返回一个可变对象的引用,首先应该使用clone()方法进行克隆。对象克隆时指存放在另一个新位置上的对象副本。

qq_46195726的博客 351

基于APDL语言的结构优化设计

同理,二次微分值称为二阶值。通俗地讲优化分析,指的找到一种方案可以满足所有的设计要求,而且所需的支出(如重量,面积,体积,应力,费用等)最小。设计方案的任何方面都是可以优化的,比如说:尺寸(如厚度),形状(如过渡圆角的大小),支撑位置,制造费用,自然频率,材料特性等。完成分析文件的建立后,就可以进行优化分析了,如果在交互方式下进行优化的话,最好先在ANSYS数据库中用分析文件建立参数,其优点有:初始参数可以作为一阶分析方法的起点,且对于优化过程参数在数据库中可以在GUI下进行操作,便于定义优化变量。

m0_73816777的博客 1177

java类中可变对象的引用

java类中可变变量的引用 在一个java类中如果数据包含可变对象就不能使用默认get方法获取这个可变变量的引用,而应使用clone,否则会造成私有状态的改变。以Date为例: 直接使用默认的get方法。引用了可变变量进行修改,实例中的可变变量也被修改.

qq_43388713的博客 513

提取abaqus中节点集合的应力应变

节点是没有应力应变的,只有积分点才有,所以直接在odb文件里面用FieldOutput是整不出来的(结果是个空列表),只能用session这种让abaqus自己帮你处理。具体的代码需要根据自己操作的时候abaqus.rpy这个文件中代码的变化来更改。

蓝胖子的博客 4554

【目标检测】IoU(交并比)详解及代码实现

1. IOU概述        IoU的全称为交并比(Intersection over Union),是目标检测中使用的一个概念,IoU计算的是“预测的边框”和“真实的边框”的交叠率-,即它们的交集和并集的比值。最理想情况是完全重叠,即比值为1。 2. IoU计算        IoU等于“预测的边框”和“真实的边框”之间交集和并集的比值。IoU计算如下图,B1为真实

Roaddd的博客 2万+

java返回对象的引用_Java 返回可变引用对象的相关问题

1.问题/*** 输出: Mon Apr 26 10:54:10 CST 2010* Mon Apr 26 10:54:10 CST 2010*/public static void main(String[] args){Example test = new Example(new Date());Date d = test.getDate();double tenYearsInMi...

weixin_29811891的博客 764

LSTM+Transformer混合模型时间序列预测实战教学

LSTM+Transformer混合模型时间序列预测实战教学 毕业设计

8220

Java--不要编写返回引用可变对象的访问方法

public class Employee { private Date hirDate; public Date getHirDate() { return hirDate; } }在日常的开发过程中,注意要尽量编写返回引用可变对象的访问器的方法。在上边的Employee类中,就违反这种原则,其中的getHirDate()方法返回了一个Date类的对象;在Date类中有一个修改器...

m0_37618340的博客 723

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

4.3 不要编写返回引用可变对象的访问器方法

在看《Java核心技术(原书第8版中文版)》的时候,看到108页的一个警告,“注意不要编写返回引用可变对象 的访问器方法”。以前没看到过,原来Date对象是可变对象。就可变对象这个概念,查了一下网,我认为可变对 象,就是在类中可以不通过域更改器方法就能改变值的对象。 代码如下: [java] view plaincopy import java.util.Date; i

qiaotong1的专栏 622

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

关于Java中编写返回可变对象引用的访问器方法

警告:在Java中,注意不要编写返回可变对象引用的访问器方法。 例如: class Employee { private Date hireDay; ... public Date getHireDay() { return hireDay; // 注意,Date类有一个更改器方法setTime,Date对象是可变的,这一点破坏了封装性 } ... } 注意,在接下来,如果我...

qq_44149376的博客 421

不要编写返回引用可变对象的访问器

JAVA Core 中有一段话:注意不要编写返回引用可变对象的访问器,今天刚学习了一下,说说我的理解。 运行以下代码,通过修改器setTime修改d,输出harry.getTime会随之改变,因为对象hireday是Date类是一个可变对象,而修改name=”aaa“,输出harry.getName仍然得到harry,而不是“aaa”,因为对象name是String类是一个不可变对象。

cxwrq42的博客 1272

不要编写返回引用可变对象的访问器方法

JAVA核心技术–随笔注意不要编写返回引用可变对象的访问器方法class Employee{ private Date hireDay; //其他 public Date getHireDay() { return hireDay;//不好的写法 } }执行如下代码:Employee harry = new Employee(); ha

带翅膀的猫的博客 4317

警告:不要编写返回可变对象引用的访问器方法(getter)

警告:不要编写返回可变对象引用的访问器方法(getter) import java.util.Date; /* 不要编写返回可变对象引用的访问器方法(getter) */ public class Demo { public static void main(String[] args) { DemoTest demoTest = new DemoTest(); System.out.println(demoTest.getHireDay());

BY_WJL的博客 340

请不要编写返回可变对象的访问器(get)

为返回可变对象的访问器创建副本(克隆)

my blog 1369

不可变对象:多线程安全的秘密武器!

文章:不可变对象因其状态一旦创建便无法更改的特性,天生具备多线程安全的优势。在Java编程中,不可变对象避免了共享可变状态带来的竞态条件与内存可见性问题,极大简化了并发程序的设计复杂度。通过分析其核心原理和应用场景,探讨如何巧妙运用不可变对象这一“秘密武器”,提升代码的健壮性和开发效率!

yanpeng2580的博客 564

(设计原则)禁止编写返回可变对象引用的访问器方法

设计原则,这样的设计错误,出现bug很难发现

DachuiStudyJava的博客 187

Oracle Java官网关于不可变对象的解析

Oracle Java官网关于不可变对象的解析一、Immutable Objects(不可变对象)1. 原文url2. 原文翻译二、A Synchronized Class Example(一个同步类的例子)1. 原文url2.原文代码3. 原文翻译三、A Strategy for Defining Immutable Objects(定义不可变对象的策略)1.原文url2.原文翻译3.原文代码 一、Immutable Objects(不可变对象) 1. 原文url https://docs.oracle

Dylaniou的博客 848
上一篇: Java中的对象与类
下一篇: 基于类的访问权限
IBLiplus
博客等级 码龄8年 132粉丝 265原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值