compareto 和_清洁责任–摆脱均等,compareTo和toString
compareto 和
您是否看過Java中Object類的javadoc? 大概。 您傾向于時不時地到達(dá)那里,然后沿著繼承樹進(jìn)行挖掘。 您可能已經(jīng)注意到的一件事是,每個類都必須繼承許多方法。 實(shí)現(xiàn)自己而不是堅(jiān)持使用原始方法的最喜歡的方法可能是.toString()、. equals()和.hashCode()( Per-?keMinborg在本文中很好地描述了為什么應(yīng)該始終實(shí)現(xiàn)這兩種方法) )。
但是這些方法顯然還不夠。 許多人從標(biāo)準(zhǔn)庫(如Comparable和Serializable)中混合使用其他接口。 但這真的很明智嗎? 為什么每個人都想如此糟糕地自己實(shí)現(xiàn)這些方法? 好吧,如果您打算將它們存儲在HashMap之類中并希望控制哈希沖突,那么實(shí)現(xiàn)自己的.equals()和.hashCode()方法可能會很有意義,但是compareTo()和toString()呢?
在本文中,我將介紹一種在Speedment開源項(xiàng)目中使用的軟件設(shè)計(jì)方法,該方法將對對象進(jìn)行操作的方法實(shí)現(xiàn)為存儲在變量中的功能引用,而不是覆蓋內(nèi)置在方法中的Java。 這有幾個優(yōu)點(diǎn)。 您的POJO將會更短,更簡潔,可以在不繼承的情況下重用常見操作,并且可以靈活地在不同配置之間進(jìn)行切換。
原始碼
讓我們從下面的示例開始。 我們有一個典型的Java類,名為Person。 在我們的應(yīng)用程序中,我們要按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在此處實(shí)現(xiàn)了幾種方法來控制流的輸出。 hashCode()和equals()方法確保不能將重復(fù)的人添加到集合中。 sorted操作使用compareTo()方法生成所需的順序。 重寫的toString()方法最終控制了在調(diào)用System.out.println()時應(yīng)如何打印每個Person。 您認(rèn)識這種結(jié)構(gòu)嗎? 您幾乎可以在幾乎所有的Java項(xiàng)目中找到它。
替代代碼
除了將所有功能都放入Person類之外,我們還可以嘗試使其盡可能保持清潔,并使用功能引用來處理這些修飾。 我們用equals,hashCode,compareTo和toString刪除所有樣板,而是引入兩個靜態(tài)變量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)這種方法的好處是,我們現(xiàn)在可以在不更改Person類的情況下替換打印的順序和格式。 這將使代碼更易于維護(hù),更易于重用,而不是說編寫起來更快。
翻譯自: https://www.javacodegeeks.com/2016/02/cleaner-responsibilities-get-rid-equals-compareto-tostring.html
compareto 和
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的compareto 和_清洁责任–摆脱均等,compareTo和toString的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jvm ide_通过微调JVM Garb
- 下一篇: 教程:芯邦扩容U盘CBM2098恢复容量