无法访问java中的内部类问题

时间:2015-12-31 09:26:24

标签: java

从内部类引用的局部变量必须是最终的或有效的最终错误显示在下面的代码中:

public Vector<Map<String, Object>> newsFeedConnection(String var, Hashtable punishment) {
    ConnectionRequest connectionRequest;
    connectionRequest = new ConnectionRequest() {
        @Override
        protected void readResponse(InputStream input) throws IOException {
            JSONParser p = new JSONParser();
            results = p.parse(new InputStreamReader(input));

            punishment = (Hashtable) results.get("punishment");
        }
    }
}

但是当我将其更改为final(下面的代码)时,它会给出&#34;无法为最终变量惩罚分配值#34;再次出错。

public Vector<Map<String, Object>> newsFeedConnection(String var, final Hashtable punishment) {
    ConnectionRequest connectionRequest;
    connectionRequest = new ConnectionRequest() {
        @Override
        protected void readResponse(InputStream input) throws IOException {
            JSONParser p = new JSONParser();
            results = p.parse(new InputStreamReader(input));

            punishment = (Hashtable) results.get("punishment");
        }
    }
}

如何解决这个问题?如果我设置了一个全局变量,我就无法从其他类中的方法中访问该值。

3 个答案:

答案 0 :(得分:2)

您正在重新启动一个概念上不可接受的最终变量,只需更改惩罚中的值而不再创建它,这将解决您的问题。

答案 1 :(得分:0)

传递值与传递参考 - 传递对象引用时,您正在通过引用传递。执行此操作时,可以通过在对象上调用适当的方法来更改对象的状态,但不能更改对象本身的引用。例如:

    public class TestPassByReference {

    public static void main(String[] args){
        StringBuilder stringBuilder = new StringBuilder("Lets Test!");
        changeStringDoesNotWork(stringBuilder);
        System.out.println(stringBuilder.toString());
        changeString(stringBuilder);
        System.out.println(stringBuilder.toString());
    }

    static void changeString(StringBuilder stringBuilder){
        stringBuilder.append(" Yeah I did it!");
    }

    static void changeStringDoesNotWork(StringBuilder stringBuilder){
        stringBuilder = new StringBuilder("This will not work!");
    }
}

输出:

Lets Test!               //Value did not change
Lets Test! Yeah I did it!

我希望你现在可以将你想要做的事情与这个基本方面联系在一起,因而不正确。

你可以做的是:

HashTable tempHashTable = (Hashtable) results.get("punishment");    
punishment.clear();
punishment.putAll(tempHashTable);

另外为什么要使用HashTable?有更好的线程安全集合类可以提供更好的性能。

答案 2 :(得分:0)

您可以通过更新punishment变量来解决此问题:

public Vector<Map<String, Object>> newsFeedConnection(String var,  final Hashtable punishment) {
        ConnectionRequest connectionRequest;
        connectionRequest = new ConnectionRequest() {
            @Override
            protected void readResponse(InputStream input) throws IOException {
                JSONParser p = new JSONParser();
                results = p.parse(new InputStreamReader(input));

                punishment.putAll((Hashtable) results.get("punishment"));
                  }
            }
        }
}