1
public Collection<QueueMetrics> getAllGatewayQueueMetricsCurrent(String keywords)
{
    QueueMetrics qmInput = null;
    QueueMetrics qmImport = null ;
    QueueMetrics qmReport = null ;
    ArrayList<QueueMetrics> metrics = new ArrayList<QueueMetrics>();

    for (String keyword : keywords.split(",")){
        ConsoleServiceMBean console = getConsoleService(keyword);
        populateMessageCountStr(qmInput, keyword, console, "input");
        populateMessageCountStr(qmImport, keyword, console, "import");
        populateMessageCountStr(qmReport, keyword, console, "report");
    }
    metrics.add(qmInput);
    metrics.add(qmImport);
    metrics.add(qmReport);

    return metrics;
}

private void populateMessageCountStr(QueueMetrics qMetrics, String keyword, ConsoleServiceMBean console, String type)
{
    QueueMetrics tempMetric = console.getGatewayQueueMetricsCurrent(type, keyword);
            if( qMetrics == null ){
             qMetrics = tempMetric ;
    }else{
        qMetrics.setPendingMessageCountStr( qMetrics.getPendingMessageCountStr() + ", " + tempMetric.getPendingMessageCount());
         }

}

我尝试通过调用 populateMessageCountStr 并传入要更新的对象本身来更新上部 for 循环中的 qmInput、qmImport 和 qmReport。在下一个循环中,同一个对象将用额外的数据再更新一次。但是,这个程序的最终结果是 qmInput、qmImport 和 qmReport 都为空。有人知道为什么吗?为了提供更多信息,当我稍微更改上层函数时:

        qmInput = populateMessageCountStr(qmInput, keyword, console, "input");
        qmImport = populateMessageCountStr(qmImport, keyword, console, "import");
        qmReport = populateMessageCountStr(qmReport, keyword, console, "report");

并且 lower 函数返回更新后的 QueueMetrics 而不是 void。该程序按预期工作。有人知道为什么原来的方法不起作用吗?我感谢任何有用的评论。

4

3 回答 3

2

但是,这个程序的最终结果是 qmInput、qmImport 和 qmReport 都为空。

QueueMetrics因为,如果它等于,您正在将该方法中传递的引用重新分配给一个新对象null,它将在第一次调用时出现。在这种情况下,原始引用仍将指向null. 因此,它将保留null在该方法的所有进一步调用中,因为条件qMetrics == null将始终为true

由于 Java 通过 Value 传递引用,因此将 重新分配qMetrics给不同的实例,将更改传递的引用副本的值。但它不会修改原始参考的参考值。

要解决此问题,只需从方法返回修改后的引用(将返回类型更改populateMessageCounterStr()QueueMetrics,并将其分配给调用方的原始引用。

于 2013-08-23T22:04:37.917 回答
0

qMetrics 是在本地设置的,对它的引用会丢失。因此,除非您返回该引用,否则方法的调用者 populateMessageCountStr将无法看到对它的引用。

if( qMetrics == null ){
             qMetrics = tempMetric ;

当它改为

qmInput = populateMessageCountStr

并另外更改返回类型return qMetricspopulateMessageCountStr

在第一次迭代中,当qMetrics为 null 时创建新实例console.getGatewayQueue...(并假设它不返回 null)qMetrics引用被返回并存储在其中,并在后续迭代qmInput中传递给它。populateMessageCountStr

于 2013-08-23T22:12:05.877 回答
0

在java中:

Object a = null;
Object b = a;
b = "foo";

留下一个空值,这是你的问题。你想做的是:

Object a = <something>;
Object b = a;
b.mutate();

这是安全的,因为 b.mutate 正在改变 <something>,所以实际上 a.mutate() 和 b.mutate() 是等价的。

于 2013-08-23T22:18:51.380 回答