Java 如果我每次都将一个新对象传递给一个方法,这是自I';我分配了这么多的新对象,以至于可能无法使用?

Java 如果我每次都将一个新对象传递给一个方法,这是自I';我分配了这么多的新对象,以至于可能无法使用?,java,android,Java,Android,我有一个名为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; }

我有一个名为
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);
}
staticgetquery(字符串散列,一个obj){
BaseCall call=mCalls.get(散列);
if(call==null){
call=obj;
}
mCalls.put(hash,obj);
}
这意味着我做
getQuery(“fdafodafjdf”,newmycall())
表示每次调用
getQuery
时都使用新单词。这是一种糟糕的做法,因为我每次调用时都分配一个新对象

事实上,
mCalls
是一个
WeakHashMap
,有非常频繁的
put
get
,而且由于字段太多,
MyCall
是一个昂贵的初始化操作


基本上,我正在实现
getOrDefault(key,defaultValue)
,因为我正在使用的当前Android版本不允许使用它。

如果每次都要更改对象集,那么它是正确的,但如果每次都创建一个新的对象集,这不是最佳做法。您可以实现另一个代码:

static <A extend BaseCall> getQuery(String hash, A obj) {
    BaseCall call = mCalls.get(hash);
    if (call == null || ! call.getClass() istanceof call.getClass() ) {
        call = obj;
        mCalls.put(hash, obj);
    }
}
staticgetquery(字符串散列,一个obj){
BaseCall call=mCalls.get(散列);
if(call==null | |!call.getClass()调用的istanceof.getClass()){
call=obj;
mCalls.put(hash,obj);
}
}

您可能希望创建自己的。因为当您使用
getQuery(“fdafodafjdf”,new MyCall())
时,您总是创建一个新对象

与:

只有当贴图不包含具有所需关键点的对象时,才会创建新对象


这在没有Java 8的情况下也适用,但您必须创建自己的接口/类:

public interface Function<T, R> {
    R apply(T t);
}
公共接口功能{
R应用(T);
}
并使用匿名类:

getQuery("fdafodafjdf", new Function<String,BaseCall>(){
    @Override
    public BaseCall apply(String key) {
        return new MyCall();
    }
});
getQuery(“fdafodafjdf”,新函数(){
@凌驾
公共基址呼叫应用(字符串键){
返回新的MyCall();
}
});

我想我们需要更多的上下文。从您提供的信息来看,我无法判断它是好是坏。当这是您的完整
getQuery
时,如果(call==null){call=obj;}行将不会做任何事情,因为从来没有使用过
call
。但是这个问题并不令人满意,尽管这个解决方案很有趣,请注意,OP对其使用的Java版本有限制。OP无法使用Java 8的优点。@LuiggiMendoza查看编辑,您可以通过创建接口和使用匿名类而不是lambda来“降级”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();
    }
});