清洁责任–摆脱均等,compareTo和toString
您是否看過Java中Object類的javadoc? 大概。 您傾向于時不時地到達那里,然后沿著繼承樹進行挖掘。 您可能已經注意到的一件事是,每個類都必須繼承許多方法。 實現自己而不是堅持使用原始方法的最喜歡的方法可能是.toString()、. equals()和.hashCode()( Per-?keMinborg在本文中很好地描述了為什么應該始終實現這兩種方法) )。
但是這些方法顯然還不夠。 許多人從標準庫(如Comparable和Serializable)中混合使用其他接口。 但這真的很明智嗎? 為什么每個人都想如此嚴重地自己實現這些方法? 好吧,如果您打算將它們存儲在HashMap之類的文件中并希望控制哈希沖突,那么實現自己的.equals()和.hashCode()方法可能很有意義,但是compareTo()和toString()呢?
在本文中,我將介紹一種在Speedment開源項目中使用的軟件設計方法,其中將對對象進行操作的方法實現為存儲在變量中的功能引用,而不是覆蓋內置在方法中的Java。 這有幾個優點。 您的POJO將更短,更簡潔,可以重復使用通用操作而無需繼承,并且可以靈活地在不同配置之間進行切換。
原始碼
讓我們從下面的示例開始。 我們有一個典型的Java類,名為Person。 在我們的應用程序中,我們希望按Set的順序打印每個人的名字,其后跟姓氏(以防兩個人共享相同的名字)。
人.java
public class Person implements Comparable<Person> {private final String firstname;private final String lastname;public Person(String firstname, String lastname) {this.firstname = firstname;this.lastname = lastname;}public String getFirstname() {return firstname;}public String getLastname() {return lastname;}@Overridepublic int hashCode() {int hash = 7;hash = 83 * hash + Objects.hashCode(this.firstname);hash = 83 * hash + Objects.hashCode(this.lastname);return hash;}@Overridepublic boolean equals(Object obj) {if (this == obj) return true;if (obj == null) return false;if (getClass() != obj.getClass()) return false;final Person other = (Person) obj;if (!Objects.equals(this.firstname, other.firstname)) {return false;}return Objects.equals(this.lastname, other.lastname);}@Overridepublic int compareTo(Person that) {if (this == that) return 0;else if (that == null) return 1;int comparison = this.firstname.compareTo(that.firstname);if (comparison != 0) return comparison;comparison = this.lastname.compareTo(that.lastname);return comparison;}@Overridepublic String toString() {return firstname + " " + lastname;} }Main.java
public class Main {public static void main(String... args) {final Set people = new HashSet<>();people.add(new Person("Adam", "Johnsson"));people.add(new Person("Adam", "Samuelsson"));people.add(new Person("Ben", "Carlsson"));people.add(new Person("Ben", "Carlsson"));people.add(new Person("Cecilia", "Adams"));people.stream().sorted().forEachOrdered(System.out::println);} }輸出量
run: Adam Johnsson Adam Samuelsson Ben Carlsson Cecilia Adams BUILD SUCCESSFUL (total time: 0 seconds)Person在此處實現了幾種方法來控制流的輸出。 hashCode()和equals()方法確保不能將重復的人添加到集合中。 sorted操作使用compareTo()方法產生所需的順序。 重寫的toString()方法最終控制了在調用System.out.println()時應如何打印每個Person。 您認識這種結構嗎? 您幾乎可以在幾乎所有的Java項目中找到它。
替代代碼
除了將所有功能都放入Person類之外,我們還可以嘗試使其盡可能保持清潔,并使用功能性引用來處理這些修飾。 我們使用equals,hashCode,compareTo和toString刪除所有樣板,而是引入兩個靜態變量COMPARATOR和TO_STRING。
人.java
public class Person {private final String firstname;private final String lastname;public Person(String firstname, String lastname) {this.firstname = firstname;this.lastname = lastname;}public String getFirstname() {return firstname;}public String getLastname() {return lastname;}public final static Comparator<Person> COMPARATOR =Comparator.comparing(Person::getFirstname).thenComparing(Person::getLastname);public final static Function<Person, String> TO_STRING =p -> p.getFirstname() + " " + p.getLastname(); }Main.java
public class Main {public static void main(String... args) {final Set people = new TreeSet<>(Person.COMPARATOR);people.add(new Person("Adam", "Johnsson"));people.add(new Person("Adam", "Samuelsson"));people.add(new Person("Ben", "Carlsson"));people.add(new Person("Ben", "Carlsson"));people.add(new Person("Cecilia", "Adams"));people.stream().map(Person.TO_STRING).forEachOrdered(System.out::println);} }輸出量
run: Adam Johnsson Adam Samuelsson Ben Carlsson Cecilia Adams BUILD SUCCESSFUL (total time: 0 seconds)這種方法的好處是,我們現在可以在不更改Person類的情況下替換打印的順序和格式。 這將使代碼更易于維護,更易于重用,而不是說編寫起來更快。
翻譯自: https://www.javacodegeeks.com/2016/02/cleaner-responsibilities-get-rid-equals-compareto-tostring.html
總結
以上是生活随笔為你收集整理的清洁责任–摆脱均等,compareTo和toString的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安在旭个人资料 安在旭简介
- 下一篇: java线程死锁_Java线程死锁–案例