
我有一个名为BaseCall的类,其中Basequery和BaseMutation扩展了BaseCall.还有许多其他类扩展了Basequery和BaseMutation.
我将所有内容存储在地图中.
static <A extend BaseCall> getquery(String hash, A obj) { BaseCall call = mCalls.get(hash); if (call == null) { call = obj; } mCalls.put(hash, obj);}这意味着我做了getquery(“fdafodafjdf”,新的MyCall());意味着我每次调用getquery时都会使用新单词.这是不好的做法,因为我每次打电话都要分配一个新对象?
事实上,mCalls是一个WeakHashMap,存在非常频繁的put和gets,并且MyCall由于这么多字段而被初始化是一项昂贵的 *** 作.
基本上我正在实现getorDefault(key,defaultValue),因为在我正在使用的当前AndroID版本中不允许它.
解决方法:
你可能想要创建自己的computeIfAbsent而不是getOrDefault.因为当你使用getquery(“fdafodafjdf”,new MyCall())时,你总是创建一个新的Object.
附:
public <A extends BaseCall> A computeIfAbsent(String key, Function<String,A> mapPingFunction) { BaseCall value =map.get(key); if(value == null) { value = mapPingFunction.apply(key); map.put(key, value); } return (A)value;}您可以像以下一样使用它:
getquery("fdafodafjdf", key -> new MyCall());并且只有在地图不包含具有所需键的对象时才会创建新对象.
这也适用于没有Java 8,但您必须创建自己的接口/类:
public interface Function<T, R> { R apply(T t);}并使用匿名类:
getquery("fdafodafjdf", new Function<String,BaseCall>(){ @OverrIDe public BaseCall apply(String key) { return new MyCall(); }}); 总结 以上是内存溢出为你收集整理的java – 如果我每次都将一个新对象传入一个方法是不好的做法,因为我分配了很多新的对象,可能不会被使用?全部内容,希望文章能够帮你解决java – 如果我每次都将一个新对象传入一个方法是不好的做法,因为我分配了很多新的对象,可能不会被使用?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)