Java:如何通过引用传递字节 []?

标签 java pass-by-reference

您可以在 .NET 中使用关键字“ref”来执行此操作。 Java有什么办法吗?

最佳答案

你在你的方法中做了什么?如果您只是填充现有数组,那么您不需要传递引用语义 - 无论是在 .NET 中还是在 Java 中。在这两种情况下,引用都将通过值传递 - 因此对 object 的更改将对调用者可见。这就像告诉别人你家的地址,然后让他们送货上门——没问题。

如果您真的想要传递引用语义,即调用者将看到对参数本身所做的任何更改,例如将其设置为 null 或对不同字节数组的引用,则任一方法都需要返回新值,或者您需要将引用传递给某种“持有人”,该持有人包含对字节数组的引用,并且可以有稍后从中获取的(可能已更改的)引用。

换句话说,如果你的方法看起来像这样:

public void doSomething(byte[] data)
{
    for (int i=0; i < data.length; i++)
    {
        data[i] = (byte) i;
    }
}

那你就没事了。如果您的方法如下所示:

public void createArray(byte[] data, int length)
{
    // Eek! Change to parameter won't get seen by caller
    data = new byte[length]; 
    for (int i=0; i < data.length; i++)
    {
        data[i] = (byte) i;
    }
}

那么您需要将其更改为:

public byte[] createArray(int length)
{
    byte[] data = new byte[length]; 
    for (int i=0; i < data.length; i++)
    {
        data[i] = (byte) i;
    }
    return data;
}

或:

public class Holder<T>
{
    public T value; // Use a property in real code!
}

public void createArray(Holder<byte[]> holder, int length)
{
    holder.value = new byte[length]; 
    for (int i=0; i < length; i++)
    {
        holder.value[i] = (byte) i;
    }
}

更多详情,请阅读 Parameter passing in C#Parameter passing in Java . (恐怕前者比后者写得好。总有一天我会抽空做一个更新。)

关于Java:如何通过引用传递字节 []?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/333151/

相关文章:

c++ - C++ 中的 const vector 引用参数

c++ - 当它绑定(bind)到调用函数中的 const 引用时,它的返回值的生命周期如何扩展到调用函数的范围?

c++ - 为什么要返回通过引用传递给 C++ 中的函数的对象?

java - Spring @PropertySource,如何读取不在类路径上,而是在WEB-INF下的文件

java - 在 Spring + Sockjs 应用程序上手动设置传输类型

java - 如何从匿名 PL/pgSQL block 返回结果?

java - 我如何能够更新集合中每个文档的值并使其随着每个文档而递增?

javascript - 即使删除原始属性后,通过引用复制到第二个属性的对象仍然存在?

c++ - 如何在没有拷贝的情况下使右值引用传递的对象保持事件状态?

java - 未知错误 : Unable to build: the file dx. jar 未从 SDK 文件夹加载