Y**G 发帖数: 1089 | 1 现在别人实现了一个API, 姑且叫API.validate(int[] data) {...}
现在假设下面两个条件:
(1) 这个API的signature是事先定好的,我无法或者无权修改。
(2) 这个API应该对数组data做只读操作,不可以修改data中元素的值。
我对这个API不太放心,担心validate破坏data中的元素值。最初的想法是在data的基
础上创建一个proxy对象,让proxy对象来检测validate是否写了,如果我的proxy探测
到validate破坏了数据,我可以assert然后别人会去修复validate中的bug。但是好像
int[]没有实现什么接口,无法产生proxy。
我现在只好将data的一个copy传递给validate,可是如果data比较长的话开销是比较大
的。
有比较好的检查validate是否破坏数据的方法吗? |
d****i 发帖数: 4809 | 2 没有完全理解你的意思,用个测试不就可以知道validate是不是改写了data了吗?比如
检查输出是不是原来的数组。
public class ArrayAPI {
//suppose this method changes data
public static void validate(int[] data) {
for(int i=0; i
data[i] *= 2;
}
}
public static void main(String[] args) {
int[] local = new int[] {1, 2, 3, 4, 5};
ArrayAPI.validate(local);
System.out.println(Arrays.toString(local));
}
}
【在 Y**G 的大作中提到】 : 现在别人实现了一个API, 姑且叫API.validate(int[] data) {...} : 现在假设下面两个条件: : (1) 这个API的signature是事先定好的,我无法或者无权修改。 : (2) 这个API应该对数组data做只读操作,不可以修改data中元素的值。 : 我对这个API不太放心,担心validate破坏data中的元素值。最初的想法是在data的基 : 础上创建一个proxy对象,让proxy对象来检测validate是否写了,如果我的proxy探测 : 到validate破坏了数据,我可以assert然后别人会去修复validate中的bug。但是好像 : int[]没有实现什么接口,无法产生proxy。 : 我现在只好将data的一个copy传递给validate,可是如果data比较长的话开销是比较大 : 的。
|
Y**G 发帖数: 1089 | 3 API是别人写的。上千行代码俺懒得看,就是看上去没问题或者简单测试一下没问题也
没把握上产品线没问题。俺现在只能defensive programming了,只传一个copy
【在 d****i 的大作中提到】 : 没有完全理解你的意思,用个测试不就可以知道validate是不是改写了data了吗?比如 : 检查输出是不是原来的数组。 : public class ArrayAPI { : //suppose this method changes data : public static void validate(int[] data) { : for(int i=0; i: data[i] *= 2; : } : } : public static void main(String[] args) {
|
N***m 发帖数: 4460 | 4 what about md5?
say you have 1M array elements,
you partition it into 100 sub arrays, do md5 for each of them,
store md5 since md5 is 16 bytes, it is not a big deal, you will only need
100*16 size to store.you also need byte array to hold subarray which is ~ as
each subarray, which is >> 100*16, so the extra memory cost is this guy, ie
10K. which is just 1/100 of original size. |
b***i 发帖数: 3043 | 5 你不能中间转移一下?
MYAPI.validate(final int[] data){
API.valiate(data)
}
【在 Y**G 的大作中提到】 : 现在别人实现了一个API, 姑且叫API.validate(int[] data) {...} : 现在假设下面两个条件: : (1) 这个API的signature是事先定好的,我无法或者无权修改。 : (2) 这个API应该对数组data做只读操作,不可以修改data中元素的值。 : 我对这个API不太放心,担心validate破坏data中的元素值。最初的想法是在data的基 : 础上创建一个proxy对象,让proxy对象来检测validate是否写了,如果我的proxy探测 : 到validate破坏了数据,我可以assert然后别人会去修复validate中的bug。但是好像 : int[]没有实现什么接口,无法产生proxy。 : 我现在只好将data的一个copy传递给validate,可是如果data比较长的话开销是比较大 : 的。
|
Y**G 发帖数: 1089 | 6 final在这里没用的
【在 b***i 的大作中提到】 : 你不能中间转移一下? : MYAPI.validate(final int[] data){ : API.valiate(data) : }
|
x****d 发帖数: 1766 | 7 do you use spring framework? if so, 无法或者无权修改 doesn't matter. you can
use mothodreplacer.
to my believe, you can at least prevent it from changing your data,
basically you just copy the original method code, and just add a few simple
test to compose the new replacing code. don't have to pass copy.
if possible, you can replace the whole old method with something you trust,
but your said you don't want to read into the old code,...
【在 Y**G 的大作中提到】 : 现在别人实现了一个API, 姑且叫API.validate(int[] data) {...} : 现在假设下面两个条件: : (1) 这个API的signature是事先定好的,我无法或者无权修改。 : (2) 这个API应该对数组data做只读操作,不可以修改data中元素的值。 : 我对这个API不太放心,担心validate破坏data中的元素值。最初的想法是在data的基 : 础上创建一个proxy对象,让proxy对象来检测validate是否写了,如果我的proxy探测 : 到validate破坏了数据,我可以assert然后别人会去修复validate中的bug。但是好像 : int[]没有实现什么接口,无法产生proxy。 : 我现在只好将data的一个copy传递给validate,可是如果data比较长的话开销是比较大 : 的。
|
y*********r 发帖数: 94 | |
q******3 发帖数: 166 | 9 没用的,你的意思就是比较两组int[] 是不是一样,那只能每个元素都比较过来,不能
漏掉一个
再不就是override这个validate,
用final? |
q******3 发帖数: 166 | 10 再不就是写个承局,随机生成n个int[],写个程序比较一下,如果没问题,然后就这
么用吧。 |
q******3 发帖数: 166 | 11 再不就是写个承局,随机生成n个int[],写个程序比较一下,如果没问题,然后就这
么用吧。 |
g*****g 发帖数: 34805 | |
a*w 发帖数: 4495 | 13 这个时间开销比拷贝还大吧。
【在 y*********r 的大作中提到】 : 比较调用前后该数组的hash code?
|