Невозможно получить доступ к проблеме внутреннего класса в 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 (код ниже), он снова выдает ошибку" не могу присвоить значение конечной переменной наказания".



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");
}
}
}


Как мне решить эту проблему?Если я задаю глобальную переменную, я не могу получить доступ к значению из метода в других классах.

434   3  

3 ответов:

Передаче по значению и пройти по ссылке, Когда вы передаете ссылку на объект, вы делаете пройти по ссылке. При этом можно изменить состояние объекта, вызвав соответствующие методы для объекта, но нельзя изменить ссылку на сам объект. Например:

    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? Есть лучшие классы коллекции threadsafe, которые дают лучшую производительность.

Вы повторно инициализируете конечную переменную, которая концептуально неприемлема, просто измените значения внутри наказания, не создавая его снова, и это решит вашу проблему.

Вы можете решить ее, обновив переменную 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"));
                  }
            }
        }
}

Comments

    Ничего не найдено.