Проблемы с доступом к экземплярам одного класса в другом классе
Я пытаюсь получить доступ к экземплярам в методе одного класса в другом классе и попытался изменить их. Но это вызывает у меня ошибку: "Невозможно сослаться на не окончательную локальную переменную 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;
}
}
};