pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

一個(gè)迭代器,它改變并返回相同的對(duì)象.不好的做

An Iterator which mutates and returns the same object. Bad practice?(一個(gè)迭代器,它改變并返回相同的對(duì)象.不好的做法?)
本文介紹了一個(gè)迭代器,它改變并返回相同的對(duì)象.不好的做法?的處理方法,對(duì)大家解決問(wèn)題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧!

問(wèn)題描述

我正在編寫 GC 友好的代碼來(lái)讀取并返回給用戶一系列 byte[] 消息.在內(nèi)部我重用相同的 ByteBuffer 這意味著我將重復(fù)返回相同的 byte[] 實(shí)例大部分時(shí)間.

我正在考慮編寫警示性 javadoc 并將其作為 迭代器.AFAIK 它不會(huì)違反 Iterator 合同,但如果他們這樣做,用戶肯定會(huì)感到驚訝 Lists.newArrayList(myIterator) 并返回一個(gè)List 在每個(gè)位置都填充了相同的 byte[]!

問(wèn)題:對(duì)于一個(gè)可能發(fā)生變異并返回相同對(duì)象的類來(lái)實(shí)現(xiàn)Iterator接口是不是不好的做法?p>

  • 如果是這樣,最好的選擇是什么?不要改變/重用你的對(duì)象"是一個(gè)簡(jiǎn)單的答案.但它并沒(méi)有解決非常需要重用的情況.

  • 如果不是,您如何證明違反最小驚訝原則?

兩個(gè)小音符:

  • 我正在使用 Guava 的 AbstractIterator 所以 remove() 并不重要.

  • 在我的用例中,用戶是 me,并且此類的可見(jiàn)性將受到限制,但我已嘗試將這個(gè)問(wèn)題廣泛應(yīng)用于更廣泛的應(yīng)用.

更新:我接受 Louis 的回答,因?yàn)樗耐镀睌?shù)是 Keith 的 3 倍,但請(qǐng)注意,在我的用例中,我打算采用我在評(píng)論中留下的代碼基思對(duì)生產(chǎn)的回答.

解決方案

EnumMap 在其 entrySet() 迭代器中基本上就是這樣做的,這會(huì)導(dǎo)致混亂、瘋狂、令人沮喪迄今為止的錯(cuò)誤.

如果我是你,我不會(huì)使用 Iterator —— 我會(huì)編寫一個(gè)不同的 API(甚至可能與 Iterator 完全不同)并實(shí)現(xiàn)它.例如,您可以編寫一個(gè)新的 API,將 input 用作寫入消息的 ByteBuffer,因此 API 的用戶可以控制緩沖區(qū)是否被重用.這看起來(lái)相當(dāng)直觀(用戶可以編寫明顯而干凈地重用 ByteBuffer 的代碼),而不會(huì)創(chuàng)建不必要的混亂代碼.

I'm writing GC friendly code to read and return to the user a series of byte[] messages. Internally I reuse the same ByteBuffer which means I'll repeatedly return the same byte[] instance most of the time.

I'm considering writing cautionary javadoc and exposing this to the user as a Iterator<byte[]>. AFAIK it won't violate the Iterator contract, but the user certainly could be surprised if they do Lists.newArrayList(myIterator) and get back a List populated with the same byte[] in each position!

The question: is it bad practice for a class that may mutate and return the same object to implement the Iterator interface?

  • If so, what is the best alternative? "Don't mutate/reuse your objects" is an easy answer. But it doesn't address the cases when reuse is very desirable.

  • If not, how do you justify violating the principle of least astonishment?

Two minor notes:

  • I'm using Guava's AbstractIterator so remove() isn't really of concern.

  • In my use case the user is me and the visibility of this class will be limited, but I've tried to ask this generally enough to apply more broadly.

Update: I'm accepting Louis' answer because it has 3x more votes than Keith's, but note that in my use case I'm planning to take the code that I left in a comment on Keith's answer to production.

解決方案

EnumMap did essentially exactly this in its entrySet() iterator, which causes confusing, crazy, depressing bugs to this day.

If I were you, I just wouldn't use an Iterator -- I'd write a different API (possibly quite dissimilar from Iterator, even) and implement that. For example, you might write a new API that takes as input the ByteBuffer to write the message into, so users of the API could control whether or not the buffer gets reused. That seems reasonably intuitive (the user can write code that obviously and cleanly reuses the ByteBuffer), without creating unnecessarily cluttered code.

這篇關(guān)于一個(gè)迭代器,它改變并返回相同的對(duì)象.不好的做法?的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,也希望大家多多支持html5模板網(wǎng)!

【網(wǎng)站聲明】本站部分內(nèi)容來(lái)源于互聯(lián)網(wǎng),旨在幫助大家更快的解決問(wèn)題,如果有圖片或者內(nèi)容侵犯了您的權(quán)益,請(qǐng)聯(lián)系我們刪除處理,感謝您的支持!

相關(guān)文檔推薦

Java Remove Duplicates from an Array?(Java從數(shù)組中刪除重復(fù)項(xiàng)?)
How to fix Invocation failed Unexpected Response from Server: Unauthorized in Android studio(如何修復(fù)調(diào)用失敗來(lái)自服務(wù)器的意外響應(yīng):在 Android 工作室中未經(jīng)授權(quán))
AES encryption, got extra trash characters in decrypted file(AES 加密,解密文件中有多余的垃圾字符)
AES Error: Given final block not properly padded(AES 錯(cuò)誤:給定的最終塊未正確填充)
Detecting incorrect key using AES/GCM in JAVA(在 JAVA 中使用 AES/GCM 檢測(cè)不正確的密鑰)
AES-256-CBC in Java(Java 中的 AES-256-CBC)
主站蜘蛛池模板: 电主轴-高速精密电主轴-高速电机厂家-瑞德沃斯品牌有限公司 | 福建珂朗雅装饰材料有限公司「官方网站」 | 电子厂招聘_工厂招聘_普工招聘_小时工招聘信息平台-众立方招工网 | 电动葫芦|手拉葫芦|环链电动葫芦|微型电动葫芦-北京市凌鹰起重机械有限公司 | 芜湖厨房设备_芜湖商用厨具_芜湖厨具设备-芜湖鑫环厨具有限公司 控显科技 - 工控一体机、工业显示器、工业平板电脑源头厂家 | 消泡剂_水处理消泡剂_切削液消泡剂_涂料消泡剂_有机硅消泡剂_广州中万新材料生产厂家 | 牛奶检测仪-乳成分分析仪-北京海谊 | 低噪声电流前置放大器-SR570电流前置放大器-深圳市嘉士达精密仪器有限公司 | sus630/303cu不锈钢棒,440C/430F/17-4ph不锈钢研磨棒-江苏德镍金属科技有限公司 | 北京网络营销推广_百度SEO搜索引擎优化公司_网站排名优化_谷歌SEO - 北京卓立海创信息技术有限公司 | 海南在线 海南一家| 【孔氏陶粒】建筑回填陶粒-南京/合肥/武汉/郑州/重庆/成都/杭州陶粒厂家 | 热回收盐水机组-反应釜冷水机组-高低温冷水机组-北京蓝海神骏科技有限公司 | 便携式高压氧舱-微压氧舱-核生化洗消系统-公众洗消站-洗消帐篷-北京利盟救援 | 深圳天际源广告-形象堆头,企业文化墙,喷绘,门头招牌设计制作专家 | 接地电阻测试仪[厂家直销]_电缆故障测试仪[精准定位]_耐压测试仪-武汉南电至诚电力设备 | 微妙网,专业的动画师、特效师、CG模型设计师网站! - wmiao.com 超声波电磁流量计-液位计-孔板流量计-料位计-江苏信仪自动化仪表有限公司 | 专业的压球机生产线及解决方案厂家-河南腾达机械厂 | 建筑工程资质合作-工程资质加盟分公司-建筑资质加盟 | 乐考网-银行从业_基金从业资格考试_初级/中级会计报名时间_中级经济师 | 国标白水泥,高标号白水泥,白水泥厂家-淄博华雪建材有限公司 | 撕碎机_轮胎破碎机_粉碎机_回收生产线厂家_东莞华达机械有限公司 | 航空障碍灯_高中低光强航空障碍灯_民航许可认证航空警示灯厂家-东莞市天翔航天科技有限公司 | 合肥汽车充电桩_安徽充电桩_电动交流充电桩厂家_安徽科帝新能源科技有限公司 | 钢丝绳探伤仪-钢丝绳检测仪-钢丝绳探伤设备-洛阳泰斯特探伤技术有限公司 | 伟秀电气有限公司-10kv高低压开关柜-高低压配电柜-中置柜-充气柜-欧式箱变-高压真空断路器厂家 | 工业冷却塔维修厂家_方形不锈钢工业凉水塔维修改造方案-广东康明节能空调有限公司 | 食品无尘净化车间,食品罐装净化车间,净化车间配套风淋室-青岛旭恒洁净技术有限公司 | 接地电阻测试仪[厂家直销]_电缆故障测试仪[精准定位]_耐压测试仪-武汉南电至诚电力设备 | 东莞猎头公司_深圳猎头公司_广州猎头公司-广东万诚猎头提供企业中高端人才招聘服务 | 家乐事净水器官网-净水器厂家「官方」 | 电动高压冲洗车_价格-江苏速利达机车有限公司 | 聚丙烯酰胺PAM-聚合氯化铝PAC-絮凝剂-河南博旭环保科技有限公司 巨野电机维修-水泵维修-巨野县飞宇机电维修有限公司 | 一体化污水处理设备,一体化污水设备厂家-宜兴市福源水处理设备有限公司 | 代理记账_免费注册公司_营业执照代办_资质代办-【乐财汇】 | STRO|DTRO-STRO反渗透膜(科普)_碟滤 | 档案密集柜_手动密集柜_智能密集柜_内蒙古档案密集柜-盛隆柜业内蒙古密集柜直销中心 | 广州二手电缆线回收,旧电缆回收,广州铜线回收-广东益福电缆线回收公司 | 美国HASKEL增压泵-伊莱科elettrotec流量开关-上海方未机械设备有限公司 | 深圳善跑体育产业集团有限公司_塑胶跑道_人造草坪_运动木地板 | 合肥通道闸-安徽车牌识别-人脸识别系统厂家-安徽熵控智能技术有限公司 |