如何通过java中的引用传递

时间:2013-09-13 21:28:50

标签: java

public class SecureSystem {
    final int low = 0;
    final int high = 1;
    HashMap<String, int[]> subject;
    HashMap<String, int[]> object;

    public SecureSystem() {
    subject = new HashMap<String, int[]>();
    object = new HashMap<String, int[]>();
    }
    ReferenceMonitor rm = new ReferenceMonitor();
    rm.ReferenceMonitor(subject,object);

    System.out.println(this.subject.get("a")); // how to make it print [1,2]?
    System.out.println(this.object.get("b")); // how to make it print [3,4]?
}
class ReferenceMonitor{
    ReferenceMonior(HashMap<String, int[]> subject, HashMap<String, int[]> object) {
        SecureSystem ss = new SecureSystem();
        ss.subject.put("a", new int{1,2});
        ss.object.put("a", new int{3,4})
    }
}

我该怎么做呢? 如果我将HashMaps传递给Reference Monitor类,并尝试读取内容,则会出现空指针错误。

非常感谢你。

3 个答案:

答案 0 :(得分:0)

您尚未初始化HashMaps。它们为null,因为您从未创建它们。

HashMap<String, int[]> map = new HashMap<String, int[]>();

答案 1 :(得分:0)

问题在于:

class ReferenceMonitor{
    ReferenceMonior(HashMap<String, int[]> subject, HashMap<String, int[]> object) {
        //these three lines are the culprit
        SecureSystem ss = new SecureSystem();
        ss.subject.put("a", new int{1,2});
        ss.object.put("a", new int{3,4})
    }
}

您将数据放在新subject局部变量内的objectSecureSystem ss映射中,这些变量在构造函数调用完成后将无法使用。您应该将数据放在subjectobject参数中,这样它们的内容也会被修改:

class ReferenceMonitor{
    ReferenceMonior(HashMap<String, int[]> subject, HashMap<String, int[]> object) {
        //code fixed
        //also, there's no need to create a new SecureSystem instance
        subject.put("a", new int[] {1,2});
        object.put("b", new int[] {3,4});
    }
}

此代码甚至可以增强来代替传递SecureSystem对象引用:

class ReferenceMonitor{
    ReferenceMonior(SecureSystem secureSystem) {
        secureSystem.getSubject().put("a", new int[] {1,2});
        secureSystem.getObject().put("b", new int[] {3,4});
    }
}

另请注意Java is NOT pass by reference

答案 2 :(得分:-1)

您是否在任何地方使用new()来初始化您的Hashmaps?如果没有。有你的答案。

你想要的是

class ReferenceMonitor{
    ReferenceMonior(HashMap<String, int[]> subject, HashMap<String, int[]> object) {
        SecureSystem ss = new SecureSystem();
        ss.subject=subject;
        ss.object=object;
        ss.subject.put("a", new int{1,2});
        ss.object.put("a", new int{3,4})
    }
}

此外,这是糟糕的代码。

1)您应该考虑使用patterns之类的builder pattern

2)您对公共数据成员的使用违反了OOP的信息隐藏原则,被认为是不好的风格。请使用setter方法。