Проблемы с доступом к экземплярам одного класса в другом классе

Я пытаюсь получить доступ к экземплярам в методе одного класса в другом классе и попытался изменить их. Но это вызывает у меня ошибку: "Невозможно сослаться на не окончательную локальную переменную nextSourceOffset, определенную в прилагаемой области видимости. И это дает мне исправление, чтобы изменить переменную на финальную". Но если я изменю ее на финальную, я не смогу увеличить их.

Я использую следующий код:

public String produce(String lastSourceOffset, final int maxBatchSize, BatchMaker batchMaker)
            throws StageException {
        long nextSourceOffset = 0;
        if (lastSourceOffset != null) {
            nextSourceOffset = Long.parseLong(lastSourceOffset);
        }
        final RtmClient client = new RtmClientBuilder(getEndPoint(), getAppKey()).setListener(new RtmClientAdapter() {
            @Override
            public void onEnterConnected(RtmClient client) {

            }
        }).build();
        SubscriptionAdapter listener = new SubscriptionAdapter() {

            @Override
            public void onSubscriptionData(SubscriptionData data) {
                int numRecords = 0;
                for (AnyJson json : data.getMessages()) {
                    jsonString = json.toString();
                    Record record = getContext().createRecord("some-id::" + nextSourceOffset);
                    Map<String, Field> map = new HashMap<>();
                    map.put("fieldName", Field.create(jsonString));
                    record.set(Field.create(map));
                    batchMaker.addRecord(record);
                    ++nextSourceOffset;
                    ++numRecords;

                }
            }

        };

Выдает ошибку в:

Record record = getContext().createRecord("some-id::" + nextSourceOffset);//error 
                    Map<String, Field> map = new HashMap<>();
                    map.put("fieldName", Field.create(jsonString));
                    record.set(Field.create(map));
                    batchMaker.addRecord(record);//error
                    ++nextSourceOffset;//error
                    ++numRecords;//error

1 ответ

Решение

Ваш внутренний класс не может получить доступ к неконечной переменной из внешней области видимости. Он также не может изменить значение переменной.

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

Быстрое и грязное решение состояло бы в том, чтобы превратить ваши локальные длинные переменные в одноэлементные массивы типа long. Сама переменная будет конечной, так как она всегда будет ссылаться на один и тот же массив, но содержимое массива все еще можно изменить.

Пример:

 public String produce(String lastSourceOffset, final int maxBatchSize, BatchMaker batchMaker)
        throws StageException {
    long[] nextSourceOffset = {0};
    if (lastSourceOffset != null) {
        nextSourceOffset[0] = Long.parseLong(lastSourceOffset);
    }
    final RtmClient client = new RtmClientBuilder(getEndPoint(), getAppKey()).setListener(new RtmClientAdapter() {
        @Override
        public void onEnterConnected(RtmClient client) {

        }
    }).build();
    SubscriptionAdapter listener = new SubscriptionAdapter() {

        @Override
        public void onSubscriptionData(SubscriptionData data) {
            int numRecords = 0;
            for (AnyJson json : data.getMessages()) {
                jsonString = json.toString();
                Record record = getContext().createRecord("some-id::" + nextSourceOffset[0]);
                Map<String, Field> map = new HashMap<>();
                map.put("fieldName", Field.create(jsonString));
                record.set(Field.create(map));
                batchMaker.addRecord(record);
                ++nextSourceOffset[0];
                ++numRecords;

            }
        }

    };
Другие вопросы по тегам