`
xusulong
  • 浏览: 80956 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Effective Java 第8条的疑问

阅读更多

 

Symmetry—The second requirement says that any two objects must agree on

whether they are equal. Unlike the first requirement, it’s not hard to imagine vio-

lating this one unintentionally. For example, consider the following class, which

implements a case-insensitive string. The case of the string is preserved by

toString but ignored in comparisons:

// Broken - violates symmetry!

public final class CaseInsensitiveString {

private final String s;

public CaseInsensitiveString(String s) {

if (s == null)

throw new NullPointerException();

this.s = s;

}

// Broken - violates symmetry!

@Override public boolean equals(Object o) {

if (o instanceof CaseInsensitiveString)

return s.equalsIgnoreCase(

((CaseInsensitiveString) o).s);

if (o instanceof String)  // One-way interoperability!

return s.equalsIgnoreCase((String) o);

return false;

}

... // Remainder omitted

}

The well-intentioned equals method in this class naively attempts to interop-

erate with ordinary strings. Let’s suppose that we have one case-insensitive string

and one ordinary one:

CaseInsensitiveString cis = new CaseInsensitiveString("Polish");

String s = "polish";

As expected,  cis.equals(s) returns  true. The problem is that while the

equals method in  CaseInsensitiveString knows about ordinary strings, the

equals method in  String is oblivious to case-insensitive strings. Therefore

s.equals(cis) returns false, a clear violation of symmetry. Suppose you put a

case-insensitive string into a collection:

List<CaseInsensitiveString> list =

new ArrayList<CaseInsensitiveString>();

list.add(cis);

What does list.contains(s) return at this point? Who knows? In Sun’s cur-

rent implementation, it happens to return false, but that’s just an implementation

artifact. In another implementation, it could just as easily return true or throw a

runtime exception. Once you’ve violated the equals contract, you simply don’t

know how other objects will behave when confronted with your object.

To eliminate the problem, merely remove the ill-conceived attempt to interop-

erate with String from the equals method. Once you do this, you can refactor the

method to give it a single return:

@Override public boolean equals(Object o) {

return o instanceof CaseInsensitiveString &&

((CaseInsensitiveString) o).s.equalsIgnoreCase(s);

}

 

这段话最后说改成的代码是

public final class CaseInsenstiveString {
	private final String s;
	
	public CaseInsenstiveString(String s) {
		if(s == null) {
			throw new NullPointerException();
		} 
		this.s = s;
	}
	
	@Override
	public boolean equals(Object o) {
		return o instanceof CaseInsenstiveString &&
			((CaseInsenstiveString) o).s.equalsIgnoreCase(s);
	}
	
	public static void main(String[] args) {
		CaseInsenstiveString cis = new CaseInsenstiveString("test");
		String s = "test";
		System.out.println(cis.equals(s));
		System.out.println(s.equals(cis));
	}
}

 测试结果,cis为Test还是test都是false

疑问

那么他这里的说法的意思是 根本不让CaseInsentiveString和String进行比较(因为o instanceof CaseInsenstiveString就是false了),即类型不同怎么比都false

还是有其他意思?

 

从对称性来看,是成立了,但是这样的例子怎么感觉不是说的这个意思,请大家指点

分享到:
评论

相关推荐

    Effective Java第三版1

    《Effective Java》是Java编程领域的一本经典著作,由Joshua Bloch撰写,该书的第三版继续提供了关于如何编写高效、优雅、可维护的Java代码的指导。以下是基于给出的目录和部分内容提取的一些关键知识点: ### 第一...

    Effective Java读书笔记.pdf

    "Effective Java读书笔记" Effective Java是一本关于Java编程语言的经典书籍,本笔记主要总结了Java语言的发展历程、静态工厂方法的应用、构造器模式的使用等重要知识点。 一、Java语言的发展历程 Java语言的发展...

    effective-java.pdf

    标题“effective-java.pdf”与描述“effective-java.pdf”表明本文档是关于Java编程实践的指南,且内容可能来自于一本名为《Effective Java》的书籍,该书是由Joshua Bloch编写,被广泛认为是Java编程的权威指南。...

    effectiveJava课件分享

    在编程领域,特别是Java开发中,"Effective Java"是一本非常经典的书籍,由Joshua Bloch撰写,书中提出了一系列最佳实践和设计原则,以帮助开发者编写出更高效、更安全的代码。根据提供的标题和描述,我们将探讨三个...

    Effective.Enterprise.Java.中文版 高清pdf 下载

    《Effective Enterprise Java》是Java开发领域的一本经典著作,由著名技术专家Bill Venners编著,被广大Java开发者誉为“四大名著”之一。这本书深入探讨了在企业级Java开发中如何写出高效、可维护和易于理解的代码...

    《Effective Java》读书分享.pptx

    该书包含 90 个条目,每个条目讨论一条规则,涵盖了 Java 编程语言的方方面面。 创建和销毁对象 在 Java 中,创建和销毁对象是非常重要的。静态工厂方法可以代替构造器,提供了更多的灵活性和性能优势。静态工厂...

    effective java 读书笔记

    《Effective Java》是Java开发领域的经典著作,作者Joshua Bloch深入浅出地阐述了编写高效、健壮的Java代码的技巧和最佳实践。以下是对该书部分内容的详细解释: 1. **产生和销毁对象** - Item1:静态工厂方法相比...

    Effective java 3 学习记录.docx

    Effective Java 3 学习记录 本学习记录主要介绍了 Effective Java 3 中的静态工厂方法和 Builder 模式两部分内容。 一、静态工厂方法 静态工厂方法是指返回类实例的命名规则,例如:from、of、valueOf、instance ...

    Effective Java.zip

    6. **第8章 方法** - 方法重写与覆盖:区别了方法重载和方法覆盖,以及它们在多态中的应用。 - 返回类型最具体者规则:讲解了方法选择的规则,即调用方法时会优先选择返回类型更具体的重载方法。 - 方法局部变量...

    effective-java 配套代码

    《Effective Java》是Java开发领域的一本经典著作,由Joshua Bloch撰写,书中提出了一系列编程最佳实践和设计模式,帮助开发者写出更高效、更可靠、更易于维护的Java代码。配套代码`effective-java-examples-master`...

    effective enterprise java 中文版

    《Effective Enterprise Java》是一本由James Gosling、Bill Venners和Cay S. Horstmann合著的经典著作,旨在帮助Java开发者深入理解和利用企业级Java技术。这本书提供了78条具体的建议,涵盖了从设计模式到并发编程...

    Effective Enterprise Java(中文) Effective Enterprise Java(中文)

    本书以若干条建议、揸南的形式,言简意赅地介绍了J2EE开发中的微妙之处。无论你是否是Java开发人员,本书都将为你开发高效的企业系统提供诸多帮助。“通过这本书,TedNeward将帮助你实现从一个优秀的Java企业应用...

    Effective Java 3rd edition(Effective Java第三版英文原版)附第二版

    Item 85: Prefer alternatives to Java serialization Item 86: Implement Serializable with great caution Item 87: Consider using a custom serialized form Item 88: Write readObject methods defensively ...

    effecctivejava 第三版中文

    《Effective Java》是Java编程领域的一本经典著作,由Joshua Bloch撰写,现在已经更新到第三版。这本书深入探讨了如何编写高效、可维护且设计良好的Java代码,是每一个Java开发者提升技能的重要参考资料。以下是对该...

    Effective-Java:Effective Java中文版第二版示例代码

    《Effective Java》是Java开发领域的经典著作,由Joshua Bloch撰写,中文版第二版更是深受广大Java开发者喜爱。这本书提供了许多实用的编程实践和经验教训,帮助开发者编写出更高效、可维护的Java代码。这里我们将...

    Effective Enterprise Java

    《Effective Enterprise Java》是一本深度探讨企业级Java应用开发的经典著作。这本书主要针对J2EE(Java 2 Platform, Enterprise Edition)平台,旨在提供一系列实用的编程指导和最佳实践,帮助开发者编写出高效、...

Global site tag (gtag.js) - Google Analytics