diff --git a/src/main/java/co/ivi/jus/error/review/songor/UseCase.java b/src/main/java/co/ivi/jus/error/review/songor/UseCase.java new file mode 100644 index 0000000..8d712ac --- /dev/null +++ b/src/main/java/co/ivi/jus/error/review/songor/UseCase.java @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2021, songor. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + */ + +package co.ivi.jus.error.review.songor; + +import co.ivi.jus.error.union.Digest; +import co.ivi.jus.error.union.Returned; + +public class UseCase { + public static void main(String[] args) { + Returned rt = Digest.of("SHA-256"); + if (rt instanceof Returned.ReturnValue rv && rv.returnValue() instanceof Digest d) { + d.digest("Hello, world!".getBytes()); + } else if (rt instanceof Returned.ErrorCode ec) { + System.out.println("Failed to get instance of SHA-256"); + } else { + // 不能使用 switch 模式匹配(穷举出所有的情景)而带来的不便之处 + throw new UnsupportedOperationException("Invalid Returned instance"); + } + } +} diff --git a/src/main/java/co/ivi/jus/flow/review/songor/UseCase.java b/src/main/java/co/ivi/jus/flow/review/songor/UseCase.java new file mode 100644 index 0000000..a0659f5 --- /dev/null +++ b/src/main/java/co/ivi/jus/flow/review/songor/UseCase.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2021, songor. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + */ + +package co.ivi.jus.flow.review.songor; + +import co.ivi.jus.flow.reactive.Destination; +import co.ivi.jus.flow.reactive.Transform; + +import java.util.concurrent.SubmissionPublisher; +import java.util.function.Function; + +public class UseCase { + public static void main(String[] args) throws InterruptedException { + transform(new Event(3, 4), UseCase::calculate); + Thread.sleep(200); + } + + public static void transform(Event event, Function function) { + SubmissionPublisher publisher = new SubmissionPublisher<>(); + Transform transform = new Transform<>(function); + Destination subscriber = new Destination<>(System.out::println); + publisher.subscribe(transform); + transform.subscribe(subscriber); + publisher.submit(event); + publisher.close(); + } + + public static int calculate(Event event) { + return (event.start() + event.duration() - 1) % 7; + } + + public static record Event(int start, int duration) { + } +} diff --git a/src/main/java/co/ivi/jus/nullp/review/songor/FullName.java b/src/main/java/co/ivi/jus/nullp/review/songor/FullName.java new file mode 100644 index 0000000..bf294cc --- /dev/null +++ b/src/main/java/co/ivi/jus/nullp/review/songor/FullName.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2021, songor. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + */ + +package co.ivi.jus.nullp.review.songor; + +public final class FullName { + private final String firstName; + private final String middleName; + private final String lastName; + + public FullName(String firstName, String middleName, String lastName) { + this.firstName = firstName; + this.middleName = middleName; + this.lastName = lastName; + } + + public Returned firstName() { + if (firstName == null) { + return Returned.ErrorCode.UNDEFINED; + } + return new Returned.ReturnValue<>(firstName); + } + + public Returned middleName() { + if (middleName == null) { + return Returned.ErrorCode.UNDEFINED; + } + return new Returned.ReturnValue<>(middleName); + } + + public Returned lastName() { + if (lastName == null) { + return Returned.ErrorCode.UNDEFINED; + } + return new Returned.ReturnValue<>(lastName); + } +} diff --git a/src/main/java/co/ivi/jus/nullp/review/songor/Returned.java b/src/main/java/co/ivi/jus/nullp/review/songor/Returned.java new file mode 100644 index 0000000..228ef64 --- /dev/null +++ b/src/main/java/co/ivi/jus/nullp/review/songor/Returned.java @@ -0,0 +1,15 @@ +/* + * Copyright (c) 2021, songor. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + */ + +package co.ivi.jus.nullp.review.songor; + +public sealed interface Returned { + record ReturnValue(T returnValue) implements Returned { + } + + enum ErrorCode implements Returned { + UNDEFINED + } +} diff --git a/src/main/java/co/ivi/jus/nullp/review/songor/UseCase.java b/src/main/java/co/ivi/jus/nullp/review/songor/UseCase.java new file mode 100644 index 0000000..101b351 --- /dev/null +++ b/src/main/java/co/ivi/jus/nullp/review/songor/UseCase.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2021, Xuelei Fan. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + */ + +package co.ivi.jus.nullp.review.songor; + +public class UseCase { + public static void main(String[] args) { + FullName jack = new FullName("Jack", "", "Brown"); + FullName rose = new FullName("Rose", null, "Brown"); + FullName nova = new FullName("Nova", "Diane", "Brown"); + System.out.println( + "Is Jack's middle name Diane? " + + hasMiddleName(jack, "Diane")); + System.out.println( + "Is Rose's middle name Diane? " + + hasMiddleName(rose, "Diane")); + System.out.println( + "Is Nova's middle name Diane? " + + hasMiddleName(nova, "Diane")); + } + + private static boolean hasMiddleName(FullName fullName, String middleName) { + return switch (fullName.middleName()) { + case Returned.ErrorCode ec -> switch (ec) { + case UNDEFINED -> false; + }; + case Returned.ReturnValue rv -> { + String returnedMiddleName = (String) rv.returnValue(); + yield returnedMiddleName.equals(middleName); + } + }; + } +} diff --git a/src/main/java/co/ivi/jus/stack/review/songor/Digest.java b/src/main/java/co/ivi/jus/stack/review/songor/Digest.java new file mode 100644 index 0000000..648e411 --- /dev/null +++ b/src/main/java/co/ivi/jus/stack/review/songor/Digest.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2021, songor. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + */ + +package co.ivi.jus.stack.review.songor; + +public sealed abstract class Digest { + private static final class SHA256 extends Digest { + @Override + public byte[] digest(byte[] message) { + // snipped + return new byte[0]; + } + } + + private static final class SHA512 extends Digest { + @Override + public byte[] digest(byte[] message) { + // snipped + return new byte[0]; + } + } + + public static Returned of(String algorithm) { + return switch (algorithm) { + case "SHA-256" -> new Returned.ReturnValue(new SHA256()); + case "SHA-512" -> new Returned.ReturnValue(new SHA512()); + case null -> { + System.getLogger("co.ivi.jus.stack.review.songor") + .log(System.Logger.Level.WARNING, + "No algorithm is specified", + new Throwable("the calling stack")); + yield Returned.ErrorCode.NO_SPECIFIED_ALGORITHM; + } + default -> { + System.getLogger("co.ivi.jus.stack.review.songor") + .log(System.Logger.Level.INFO, + "Unknown algorithm is specified " + algorithm, + new Throwable("the calling stack")); + yield Returned.ErrorCode.UNKNOWN_SPECIFIED_ALGORITHM; + } + }; + } + + public abstract byte[] digest(byte[] message); +} diff --git a/src/main/java/co/ivi/jus/stack/review/songor/Returned.java b/src/main/java/co/ivi/jus/stack/review/songor/Returned.java new file mode 100644 index 0000000..c2eda57 --- /dev/null +++ b/src/main/java/co/ivi/jus/stack/review/songor/Returned.java @@ -0,0 +1,15 @@ +/* + * Copyright (c) 2021, songor. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + */ + +package co.ivi.jus.stack.review.songor; + +public sealed interface Returned { + record ReturnValue(T returnValue) implements Returned { + } + + enum ErrorCode implements Returned { + NO_SPECIFIED_ALGORITHM, UNKNOWN_SPECIFIED_ALGORITHM + } +} diff --git a/src/main/java/co/ivi/jus/stack/review/songor/UseCase.java b/src/main/java/co/ivi/jus/stack/review/songor/UseCase.java new file mode 100644 index 0000000..ca1560e --- /dev/null +++ b/src/main/java/co/ivi/jus/stack/review/songor/UseCase.java @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2021, songor. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + */ + +package co.ivi.jus.stack.review.songor; + +public class UseCase { + public static void main(String[] args) { + Returned rt = Digest.of("SHA-128"); + switch (rt) { + case Returned.ReturnValue rv -> { + Digest d = (Digest) rv.returnValue(); + d.digest("Hello, world!".getBytes()); + } + case Returned.ErrorCode ec -> { + switch (ec) { + case NO_SPECIFIED_ALGORITHM -> System.getLogger("co.ivi.jus.stack.review.songor") + .log(System.Logger.Level.INFO, + "Unlikely to happen"); + case UNKNOWN_SPECIFIED_ALGORITHM -> System.getLogger("co.ivi.jus.stack.review.songor") + .log(System.Logger.Level.INFO, + "SHA-218 is not supported"); + } + } + } + } +}