2017-08-22 1 views
-1

Ich versuche auf die Instanzen mit einer Methode einer Klasse innerhalb einer anderen Klasse zugreifen und versuchte, sie zu ändern. Aber es wirft mich den Fehler als "Kann nicht auf die lokale non-final Variable nextSourceOffset verweisen in einem umschließenden Bereich definiert. Und es gibt mir eine Lösung, um die Variable zu ändern Endgültig." Aber wenn ich es zum endgültigen ändern, Ich kann sie nicht erhöhen.Probleme beim Zugriff auf die Instanzen einer Klasse innerhalb einer anderen Klasse

Ich verwende den folgenden Code ein:

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; 

       } 
      } 

     }; 

Es wirft den Fehler bei:

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 
+0

Mögliches Duplikat [Kann nicht in einem umschließenden Rahmen, Zufallsverfahren Fehler definiert mit der nicht endgültigen lokalen Variable Taste beziehen] (https://stackoverflow.com/questions/32305839/cannot -refer-to-the-nicht-final-local-Variable-Schaltfläche-definiert-in-einschließenden-scop) –

Antwort

1

Ihre innere Klasse kann nicht eine nicht endgültige Variable von außen Umfang zugreifen. Es kann den Wert der Variablen auch nicht ändern.

Die sauberste Lösung wäre wahrscheinlich, alle diese Informationen in einer neuen Klasse zu kapseln und als Attribute zu speichern.

Die schnell und schmutzig Lösung wäre, Ihre lokalen langen Variablen in einzelne Elementarrays des Typs lang zu machen. Die Variable selbst wäre endgültig, da sie immer auf das gleiche Array verweisen würde, aber der Inhalt des Arrays könnte immer noch geändert werden.

Beispiel:

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; 

      } 
     } 

    }; 
Verwandte Themen