Czy jest możliwość wyciagnięcia wartości z metody void?

1

Witam,
bawię się ostatnio z API XTB mam problem. Jest tam Klasa do pobierania cen instrumentów w czasie rzeczywistm (np. EURUSD). jednak używa do tego metody void, czyli wyświtli mi cenę sysoutem jednak nie mogę na niej operować. API wymusza na mnie typ metody. Słyszałem że w c# używa się do takich rzeczy tzw delegatów. Jak to wygląda w Javie i czy w ogóle jest to możliwe. Poniżej moja implementacja metody( nie wiem jak wydobyć zmienną ask żeby przeprowadzać operację:

public class StreamingListener {
    @Override
    public void receiveTickRecord(STickRecord tickRecord) {
        Double ask;
        if (tickRecord.getLevel() == 0) {
            ask = tickRecord.getAsk();
            System.out.println("Ask -> " + ask);
        }
    }
}
1

Możesz zdefiniować jako pole klasy StreamingListener dowolną kolekcję (np. BlockingQueue) i umieszczać 'ask' w tej kolekcji. Z innego wątku możesz konsumować elementy w miarę jak są umieszczane w kolekcji.

2

Nie jesteś w stanie synchronicznie dowiedzieć się jaka jest wartość, możesz ją zapisać i odczytać w innym momencie. To dobry design.

1

W temacie dobrego designu to Future może tutaj pasować

0

Kiedyś dokopałem się do "uchwytu" dla System.out.print i moje natywne funkcje działały na nim (podmieniałem na swój) ale przy powrocie (uchwyt podmieniałem na zapamiętany stary) już nic się nie wyświetlało w konsoli. Inaczej jest to rozwiązane w JDK a inaczej GCCJ, temat nie był palący więc odpuściłem sobie inaczej mój przypadek rozwiązując.

Temat zakładałem tu kilka lat temu jako niezalogowany, odpowiedzi nie było.

1

Możesz przecież w tej metodzie uzyć jakiegoś AtomicReference albo w ogóle dowolnego wrappera typu Future żeby wyciągać wartości z tej funkcji.

0

Możesz tez potraktować to jak strumień i użyć RxJavy/Reactora. Te biblioteki umożliwiają stworzenie strumienia w taki sposób, że cześć kliencka będzie widziała te wartości jako Strumień<string>, na który może się zasubskrybować

https://github.com/ReactiveX/[...]i/Creating-Observables#create

1

ale zaraz, XTB wystawia web api to jak tam jest klasa, która wystawia void wypisująca na konsole? a potem podajesz przykład takiej twojej metody? StreamingListener to jest klasa po twojej stronie?

0
GotowanaKukurydza napisał(a):

ale zaraz, XTB wystawia web api to jak tam jest klasa, która wystawia void wypisująca na konsole? a potem podajesz przykład takiej twojej metody? StreamingListener to jest klasa po twojej stronie?

StreamingListener to jest klasa z XTB, natomiast to co co jet w ciele metody receiveTickRecord(STickRecord tickRecord) to moja implementacja. Chciałem ćwiczebnie zobaczyć jak wygląda wyciąganie danych z api.
Jeśli chodzi o dane pojedyncze czy historyczne to NIE MA problemu, wszystkie metody zwracają odpowiednie typy. Problem mam właśnie z danymi w czasie rzeczywistym.

ps.Dzięki wszystkim za odzew.

1

Pobieranie danych w czasie rzeczywistym różni się od pobierania danych historycznych dlatego bo to nie Ty decydujesz kiedy pobierasz dane tylko 'czas rzeczywisty'. StreamingListener to prawdopodobnie interfejs dostępny w API. Powinieneś taki interfejs zaimplementować, a następnie zarejestrować instancję tej klasy gdzieś w API. W momencie gdy nastąpi wydarzenie na które się zarejestrowałeś, XTB wywoła Twoją metodę receiveTickRecord() i wtedy wykona się przetwarzanie, które zaimplementowałeś.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0