Either - co oznacza ten typ w JAVIE ?

0

Cześć,

Either <A, B>
Co to oznacza ? Wiem, że to ze scali, ale używam tego w JAVIE. Do czego to służy, jak działa ?

0

Either ma dwie implementacje: Left i Right. Każda z nich zawiera jedną wartość. Dzięki temu masz pewność, że w Either jest dokładnie jedna wartość - albo typu A, albo typu B.

Do czego służy? Np do zwracania błędów bez użycia wyjątków. Wtedy używasz typu Either<TypBazowyBłędu, TypBazowyWyniku> jako typu zwracanego z funkcji.

0

Ok, faktycznie to tak jest.

  1. Czy ogólnie używanie tego jest zalecane ? W sumie głównie zaciemnia to kod.
0

tzn chodzi mi o to:
Prawda, sporo upraszcza, ale ale:
nie mamy po prostu rzucenia wyjątku, musimy ifować. czy left, czy right.

2

W Scali sprawdza się dobrze. Jest sobie metoda fold i można jej użyć w ten sposób:

cośCoZwracaEither.fold(zróbCośZLewym, zróbCośZPrawym)

Ewentualnie można zrobić tak:

object EitherMonad {
  def main(args: Array[String]) {
    implicit def rightLeaningEither[A, B](either: Either[A, B]): RightProjection[A, B] = either.right
    
    val r = for {
      a <- Right('c')
      b <- Left(5)
      c <- Right('a')
    } yield c
    println(r)
  }
}

Jak w Javie się używa Either i jakie ma możliwości to nie wiem, bo to zależy skąd bierzesz te Either, ale ogólnie Either jest idiomem w programowaniu funkcyjnym, gdzie unika się wyjątków, bo łamią referential transparency.

Używając Either możesz ustrukturyzować kod inaczej niż gdybyś korzystał z try/ catch. Np:

    val r1 = for {
      a <- zdobądźWartość
      b <- cośPolicz(a)
    } yield b
    val r2 = for {
      a <- skombinujWInnySposóbJeśliTrzeba(r1)
      b <- cośTamJeszczePolicz(a)
    } yield b

Tutaj dzieją się następujące rzeczy:

  • jeżeli powiedzie się zdobądźWartość to wykonujemy na wyniku cośPolicz,
  • w innym przypadku próbujemy dostać wartość za pomocą skombinujWInnySposóbJeśliTrzeba - na niej już nie robimy cośPolicz,
  • na końcu, gdy już mamy wartość zdobytą w ten czy inny sposób to wykonujemy na niej jeszcze cośTamJeszczePolic,
    Zakładam, że w Left jest kod błędu, a w Right jest wynik (pośredni lub końcowy).

Jest późno, więc gorzej myślę, ale i tak wydaje mi się, że takie coś jest dużo czytelniejsze niż żonglowanie blokami try/ catch.

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