0
  • 我有一组可变大小的块,我想在这些块上执行一些业务逻辑。
  • 我必须使用一个“大小”参数,该参数标识要解析和处理的字节数(总计 - 在所有块中),处理后的结果应该是块列表及其大小。
  • 我编写了一个递归逻辑,它非常巧妙地解析数据,但为了让它如此整洁,我不得不将其限制为沿块边界(对齐)运行。
  • 这似乎也很好,因为我将拥有的唯一未对齐的块将是第一个和最后一个。我以前的函数可以很好地处理最后一个块,但不能处理第一个块。
  • 因此,我编写了一个不同的函数来处理块中的非对齐偏移。

  • 我的DS:

    class BlockInfo {
        private long blockID;
        private long blockSize;
    }
    
    public class BlockIDSet {
        private long offset;
        private int firstBlockIndex;
        private List<BlockInfo> resultSet;
    }
    
  • 第一个函数的工作:如果起始偏移量未对齐,则解析从偏移量到块末尾的剩余字节并返回firstBlockIndexsingle BlockInfo object并更新remaining size (numBytes).

  • 第二个函数将使用remaining size、 start fromfirstBlockIndex +1并返回 a list of BlockInfo objects

在 C++ 中,我们经常将参数作为引用传递并在函数调用中更新它们的值,以便以后可以使用更新的值。据我所知,Java 建议不要这样做。相关问题。我应该如何实现这一目标?还是我的设计有缺陷,我应该重新做?

4

1 回答 1

0

如果你想numBytes在函数调用之间传递,你必须选择:

使用函数返回值

numBytes = 1024;
numBytes = numBytes - firstJob(numBytes, ...);
secondJob(numBytes,...);

Apache commons-lang 可变对象

MutableInt numBytes = new MutableInt(1024);
firstJob(numBytes, ...);
secondJob(numBytes, ...);

在函数内部,您可以在不更改numBytes引用的情况下更改可变对象内部的整数值(在 Java 中不能这样做)


否则,如果您想更改BlockInfoBlockIDSet(作为参数传递)属性,您可以毫无问题地进行。

public void firstJob(BlockInfo bi) {
  bi.blockSize = 23;
}
于 2013-08-24T16:46:50.253 回答