Skip to content

Commit 6480c33

Browse files
committed
[>] Create domain model (sealed types)
1 parent 152d35c commit 6480c33

File tree

5 files changed

+147
-8
lines changed

5 files changed

+147
-8
lines changed

README.md

+21-8
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,24 @@ A repository for my live-coding talk [Modern Java in Action](https://nipafx.dev/
44

55
## Next
66

7-
Records:
8-
* `record ExternalPage(URI url, String content)`
9-
* compact constructor checks all arguments
10-
* `equals` with `instanceof`
11-
* `record GitHubPrPage(URI url, String content, Set<URI> links, int prNumber)`
12-
* compact constructor checks all arguments
13-
* additional constructor without `links`
14-
* `equals` with `instanceof`
7+
Sealed types:
8+
* `sealed interface Page permits ErrorPage, SuccessfulPage` with `URI url()`
9+
* `sealed interface SuccessfulPage extends Page permits ExternalPage, GitHubPage` with `String content()`
10+
* `sealed interface GitHubPage extends SuccessfulPage permits GitHubIssuePage, GitHubPrPage` with `Set<Page> links()` and
11+
```java
12+
default Stream<Page> subtree() {
13+
var subtree = new ArrayList<Page>(Set.of(this));
14+
var upcomingPages = new LinkedHashSet<>(this.links());
15+
16+
while (!upcomingPages.isEmpty()) {
17+
var nextPage = upcomingPages.removeFirst();
18+
if (!subtree.contains(nextPage) && nextPage instanceof GitHubPage nextGhPage)
19+
new LinkedHashSet<>(nextGhPage.links())
20+
.reversed()
21+
.forEach(upcomingPages::addFirst);
22+
subtree.add(nextPage);
23+
}
24+
25+
return subtree.stream();
26+
}
27+
```
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package dev.nipafx.demo.modern.page;
2+
3+
import java.net.URI;
4+
import java.util.Objects;
5+
6+
import static java.util.Objects.requireNonNull;
7+
8+
public record ErrorPage(URI url, Exception ex) {
9+
10+
public ErrorPage {
11+
requireNonNull(url);
12+
requireNonNull(ex);
13+
}
14+
15+
@Override
16+
public boolean equals(Object other) {
17+
return other == this
18+
|| other instanceof GitHubIssuePage page
19+
&& this.url.equals(page.url());
20+
}
21+
22+
@Override
23+
public int hashCode() {
24+
return Objects.hash(url);
25+
}
26+
27+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package dev.nipafx.demo.modern.page;
2+
3+
import java.net.URI;
4+
import java.util.Objects;
5+
6+
import static java.util.Objects.requireNonNull;
7+
8+
public record ExternalPage(URI url, String content) {
9+
10+
public ExternalPage {
11+
requireNonNull(url);
12+
requireNonNull(content);
13+
}
14+
15+
@Override
16+
public boolean equals(Object other) {
17+
return other == this
18+
|| other instanceof GitHubIssuePage page
19+
&& this.url.equals(page.url());
20+
}
21+
22+
@Override
23+
public int hashCode() {
24+
return Objects.hash(url);
25+
}
26+
27+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package dev.nipafx.demo.modern.page;
2+
3+
import java.net.URI;
4+
import java.util.HashSet;
5+
import java.util.Objects;
6+
import java.util.Set;
7+
8+
import static java.util.Objects.requireNonNull;
9+
10+
public record GitHubIssuePage(URI url, String content, Set<URI> links, int issueNumber) {
11+
12+
public GitHubIssuePage {
13+
requireNonNull(url);
14+
requireNonNull(content);
15+
links = Set.copyOf(links);
16+
if (issueNumber <= 0)
17+
throw new IllegalArgumentException("Issue number must be 1 or greater - was '%s' at '%s'.".formatted(issueNumber, url));
18+
}
19+
20+
public GitHubIssuePage(URI url, String content, int issueNumber) {
21+
this(url, content, new HashSet<>(), issueNumber);
22+
}
23+
24+
@Override
25+
public boolean equals(Object other) {
26+
return other == this
27+
|| other instanceof GitHubIssuePage page
28+
&& this.url.equals(page.url());
29+
}
30+
31+
@Override
32+
public int hashCode() {
33+
return Objects.hash(url);
34+
}
35+
36+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package dev.nipafx.demo.modern.page;
2+
3+
import java.net.URI;
4+
import java.util.HashSet;
5+
import java.util.Objects;
6+
import java.util.Set;
7+
8+
import static java.util.Objects.requireNonNull;
9+
10+
public record GitHubPrPage(URI url, String content, Set<URI> links, int prNumber) {
11+
12+
public GitHubPrPage {
13+
requireNonNull(url);
14+
requireNonNull(content);
15+
links = Set.copyOf(links);
16+
if (prNumber <= 0)
17+
throw new IllegalArgumentException("PR number must be 1 or greater - was '%s' at '%s'.".formatted(prNumber, url));
18+
}
19+
20+
public GitHubPrPage(URI url, String content, int prNumber) {
21+
this(url, content, new HashSet<>(), prNumber);
22+
}
23+
24+
@Override
25+
public boolean equals(Object other) {
26+
return other == this
27+
|| other instanceof GitHubPrPage page
28+
&& this.url.equals(page.url());
29+
}
30+
31+
@Override
32+
public int hashCode() {
33+
return Objects.hash(url);
34+
}
35+
36+
}

0 commit comments

Comments
 (0)