Myślałem, czy istnieje lepszy / ładniejszy sposób na zanegowanie instanceof
w Javie. Właściwie robię coś takiego:
if(!(str instanceof String)) { /* do Something */ }
Uważam jednak, że powinna istnieć „piękna” składnia do tego celu.
Czy ktoś wie, czy istnieje i jak wygląda składnia?
EDYCJA: Pięknie, mogę powiedzieć coś takiego:
if(str !instanceof String) { /* do Something */ } // compilation fails
instanceof
...boolean strIsString = str instanceof String;
...Odpowiedzi:
Nie, nie ma lepszego sposobu; twój jest kanoniczny.
źródło
Nie wiem, co sobie wyobrażasz, kiedy mówisz „piękny”, ale co z tym? Osobiście uważam, że jest gorzej niż klasyczna forma, którą opublikowałeś, ale ktoś może się spodobać ...
źródło
!= true
zamiast== false
: Dif(!(str instanceof String))
jest to jedyny właściwy sposób, i muszę przestać myśleć o alternatywachMożesz użyć
Class.isInstance
metody:... ale wciąż jest negowane i dość brzydkie.
źródło
this method returns true if the specified Object argument is an instance of the represented class (or of any of its subclasses)
Zwykle nie chcesz po prostu
if
aleelse
klauzula, jak również.można zapisać jako
Możesz też napisać kod, aby nie trzeba było wiedzieć, czy jest to ciąg znaków, czy nie. na przykład
można zapisać jako
źródło
Jeśli możesz użyć importu statycznego, a twój kodeks moralny na to pozwala
I wtedy...
To tylko płynne ćwiczenie interfejsu, nigdy nie użyłbym tego w prawdziwym kodzie!
Idź swoją klasyczną drogą, nie pomyli to nikogo, kto czyta Twój kod!
źródło
Jeśli uznasz to za bardziej zrozumiałe, możesz zrobić coś takiego z Javą 8:
źródło
if (Predicate.not(isInstanceOfTheClass).test(myObject)) { ...
. Nie lepiej, imo, ale powinno działać!ok tylko moje dwa centy, użyj metody is string:
źródło
Możesz to zrobić, wykonując poniższy sposób. Po prostu dodaj warunek, dodając nawias
if(!(condition with instanceOf))
do całego warunku, dodając!
operator na początku w sposób opisany w poniższych fragmentach kodu.zamiast
źródło
Zgadzam się, że w większości przypadków
if (!(x instanceof Y)) {...}
jest to najlepsze podejście, ale w niektórych przypadkach warto utworzyćisY(x)
funkcję, abyś mógłif (!isY(x)) {...}
to zrobić .Jestem nowicjuszką maszynopisu i wpadłem na to pytanie kilka razy w ciągu ostatnich kilku tygodni, więc dla googlersów sposobem na zrobienie tego jest utworzenie takiego maszynopisarki:
typeGuards.ts
stosowanie
Wydaje mi się, że jedynym powodem, dla którego może to być odpowiednie w maszynopisie, a nie w zwykłym js, jest fakt, że typguardy są powszechną konwencją, więc jeśli piszesz je dla innych interfejsów, rozsądne / zrozumiałe / naturalne jest pisanie ich również dla klas.
Jest więcej szczegółów o zdefiniowane przez użytkownika strażników typu jak ten w docs
źródło