`

《effective java》之五:枚举和注解

    博客分类:
  • Java
阅读更多

第30条:用enum代替int常量:

public enum Operation {
	PLUS("+") {
		double apply(double x, double y) {
			return x + y;
		}
	},
	MINUS("-") {
		double apply(double x, double y) {
			return x - y;
		}
	},
	TIMES("*") {
		double apply(double x, double y) {
			return x * y;
		}
	},
	DIVIDE("/") {
		double apply(double x, double y) {
			return x / y;
		}
	};
	private final String symbol;

	Operation(String symbol) {
		this.symbol = symbol;
	}

	@Override
	public String toString() {
		return symbol;
	}

	abstract double apply(double x, double y);

	// Implementing a fromString method on an enum type - Page 154
	private static final Map<String, Operation> stringToEnum = new HashMap<String, Operation>();
	static { // Initialize map from constant name to enum constant
		for (Operation op : values())
			stringToEnum.put(op.toString(), op);
	}

	// Returns Operation for string, or null if string is invalid
	public static Operation fromString(String symbol) {
		return stringToEnum.get(symbol);
	}

	// Test program to perform all operations on given operands
	public static void main(String[] args) {
		double x = Double.parseDouble(args[0]);
		double y = Double.parseDouble(args[1]);
		for (Operation op : Operation.values())
			System.out.printf("%f %s %f = %f%n", x, op, y, op.apply(x, y));
	}
}

 

第31条:用实例域代替序数:

public enum Ensemble {
	SOLO(1), DUET(2), TRIO(3), QUARTET(4), QUINTET(5), SEXTET(6), SEPTET(7), OCTET(
			8), DOUBLE_QUARTET(8), NONET(9), DECTET(10), TRIPLE_QUARTET(12);

	private final int numberOfMusicians;

	Ensemble(int size) {
		this.numberOfMusicians = size;
	}

	public int numberOfMusicians() {
		return numberOfMusicians;
	}
}

 

 第32条:用EnumSet代替位域:

public class Text {
	public enum Style {
		BOLD, ITALIC, UNDERLINE, STRIKETHROUGH
	}

	// Any Set could be passed in, but EnumSet is clearly best
	public void applyStyles(Set<Style> styles) {
		// Body goes here
	}

	// Sample use
	public static void main(String[] args) {
		Text text = new Text();
		text.applyStyles(EnumSet.of(Style.BOLD, Style.ITALIC));
    }
}

 

第33条:用EnumMap代替序数索引:

public enum Phase {
	SOLID, LIQUID, GAS;

	public enum Transition {
		MELT(SOLID, LIQUID), FREEZE(LIQUID, SOLID), BOIL(LIQUID, GAS), CONDENSE(
				GAS, LIQUID), SUBLIME(SOLID, GAS), DEPOSIT(GAS, SOLID);

		private final Phase src;
		private final Phase dst;

		Transition(Phase src, Phase dst) {
			this.src = src;
			this.dst = dst;
		}

		// Initialize the phase transition map
		private static final Map<Phase, Map<Phase, Transition>> m = new EnumMap<Phase, Map<Phase, Transition>>(
				Phase.class);
		static {
			for (Phase p : Phase.values())
				m.put(p, new EnumMap<Phase, Transition>(Phase.class));
			for (Transition trans : Transition.values())
				m.get(trans.src).put(trans.dst, trans);
		}

		public static Transition from(Phase src, Phase dst) {
			return m.get(src).get(dst);
		}
	}

	// Simple demo program - prints a sloppy table
	public static void main(String[] args) {
		for (Phase src : Phase.values())
			for (Phase dst : Phase.values())
				if (src != dst)
					System.out.printf("%s to %s : %s %n", src, dst,
							Transition.from(src, dst));
	}
}

 

第34条:用接口模拟可伸缩的枚举:

public interface Operation {
	double apply(double x, double y);
}

 

public enum BasicOperation implements Operation {
	PLUS("+") {
		public double apply(double x, double y) {
			return x + y;
		}
	},
	MINUS("-") {
		public double apply(double x, double y) {
			return x - y;
		}
	},
	TIMES("*") {
		public double apply(double x, double y) {
			return x * y;
		}
	},
	DIVIDE("/") {
		public double apply(double x, double y) {
			return x / y;
		}
	};
	private final String symbol;

	BasicOperation(String symbol) {
		this.symbol = symbol;
	}

	@Override
	public String toString() {
		return symbol;
	}
}

 

第35条:注解优于命名模式:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface ExceptionTest {
	Class<? extends Exception>[] value();
}


public class Sample2 {
	@ExceptionTest(ArithmeticException.class)
	public static void m1() { // Test should pass
		int i = 0;
		i = i / i;
	}

	@ExceptionTest(ArithmeticException.class)
	public static void m2() { // Should fail (wrong exception)
		int[] a = new int[0];
		int i = a[1];
	}

	@ExceptionTest(ArithmeticException.class)
	public static void m3() {
	} // Should fail (no exception)

	// Code containing an annotation with an array parameter - Page 174
	@ExceptionTest({ IndexOutOfBoundsException.class,
			NullPointerException.class })
	public static void doublyBad() {
		List<String> list = new ArrayList<String>();

		// The spec permits this method to throw either
		// IndexOutOfBoundsException or NullPointerException
		list.addAll(5, null);
	}
}

 

public class RunTests {
	public static void main(String[] args) throws Exception {
		int tests = 0;
		int passed = 0;
		Class testClass = Class.forName(args[0]);
		for (Method m : testClass.getDeclaredMethods()) {
			if (m.isAnnotationPresent(Test.class)) {
				tests++;
				try {
					m.invoke(null);
					passed++;
				} catch (InvocationTargetException wrappedExc) {
					Throwable exc = wrappedExc.getCause();
					System.out.println(m + " failed: " + exc);
				} catch (Exception exc) {
					System.out.println("INVALID @Test: " + m);
				}
			}

			// Array ExceptionTest processing code - Page 174
			if (m.isAnnotationPresent(ExceptionTest.class)) {
				tests++;
				try {
					m.invoke(null);
					System.out.printf("Test %s failed: no exception%n", m);
				} catch (Throwable wrappedExc) {
					Throwable exc = wrappedExc.getCause();
					Class<? extends Exception>[] excTypes = m.getAnnotation(
							ExceptionTest.class).value();
					int oldPassed = passed;
					for (Class<? extends Exception> excType : excTypes) {
						if (excType.isInstance(exc)) {
							passed++;
							break;
						}
					}
					if (passed == oldPassed)
						System.out.printf("Test %s failed: %s %n", m, exc);
				}
			}
		}
		System.out.printf("Passed: %d, Failed: %d%n", passed, tests - passed);
	}
}

 

第36条:坚持使用Override注解:

 

第37条:用标记接口定义类型:

 

本人博客已搬家,新地址为:http://yidao620c.github.io/

分享到:
评论

相关推荐

    Effective Java第三版1

    《Effective Java》是Java编程领域的一本经典著作,由Joshua Bloch撰写,它提供了许多最佳实践和设计原则,帮助开发者写出更高效、更可维护的代码。第三版延续了这一传统,对Java语言的新特性进行了更新,并给出了...

    2021年EFFECTIVEJAVA读书笔记.docx

    本文总结了Effective Java 中关于枚举与注解的知识点,涵盖了枚举类型的优点、使用指南、避免使用 int 常量、使用 EnumSet 和 EnumMap 等。 枚举类型的优点 枚举类型提供了编译时类型安全、自动命名空间隔离、可以...

    Effective Java.zip

    - 注解:解释注解的元数据功能,如何创建自定义注解以及处理注解的反射API。 5. **第7章 Lambda和Stream** - Lambda表达式:介绍Java 8引入的Lambda表达式,简化函数式编程。 - Stream API:讲解如何使用Stream...

    《Effective Java》读书分享.pptx

    其他知识点还包括泛型、枚举和注解、Lambda 和 Stream、方法、通用编程、异常、并发、序列化等。这些知识点都是 Java 编程语言的核心内容,了解和掌握这些知识点对于编写高质量的 Java 代码至关重要。 《Effective ...

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

    这些知识点都是基于《Effective Java》第二版中的主要观点,通过阅读和实践书中的示例代码,可以深入理解并应用到实际项目中,从而提升Java编程的技能水平。同时,书中还涵盖了其他很多话题,如序列化、注解、反射等...

    effecctivejava 第三版中文

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

    effectiveJava的笔记

    4. **枚举**:介绍枚举类型的强大之处,如枚举的自动序列化、枚举常量之间的比较以及它们可以拥有方法和字段,优于传统的`int`常量。 5. **泛型**:讲解泛型的基本用法,包括类型擦除、边界通配符、类型推断,以及...

    Effective-Java-2nd-Edition-(May-2008).zip_effective java

    3. **枚举代替常量类**:书中推荐使用枚举类型替代传统的公共静态final变量,因为枚举提供了更强的类型安全性和更丰富的功能,如枚举方法和枚举实例的集合操作。 4. **避免使用原始类型数组**: Bloch提倡使用泛型...

    Java-Effective:Java Effective 2nd Edition书中的源代码

    《Effective Java》是Java开发领域的经典著作,由Joshua Bloch撰写,第二版更是程序员们不可或缺的参考书籍。这本书深入探讨了如何编写出高质量、高效、可维护的Java代码,涵盖了众多最佳实践和设计模式。这里我们将...

    EffectiveJava:有效的 Java 示例

    《EffectiveJava》是Java开发领域的经典著作,由Joshua Bloch撰写,提供了许多关于如何编写高效、可维护和设计良好的Java代码的实用建议。这本书的第2版在原有的基础上进行了更新,以适应Java语言的新发展。现在,...

    Effective.Java_Java8_并发_java_effectivejava_

    目录:一、创建和销毁对象 (1 ~ 7)二、对于所有对象都通用的方法 (8 ~ 12)三、类和接口 (13 ~ 22)四、泛型 (23 ~ 29)五、枚举和注解 (30 ~ 37)六、方法 (38 ~ 44)七、通用程序设计 (45 ~ 56)八、异常 ...

    Effective Java 第三版

    这些规则和建议基于作者多年的经验,涵盖了广泛的主题,包括集合、泛型、枚举、注解、方法设计、并发编程等方面。 在描述中提到的EPUB是一种开放性的电子书标准格式,它支持多种功能,但这些功能在不同阅读设备和...

    java源码总结-Effective-Java-3E:有效Java第三版的源代码示例和摘要的回购

    以下是对《Effective Java》第三版源代码示例和摘要的一些关键知识点的详细解释: 1. **枚举(Enums)**:书中强调了使用枚举类型而不是常量类的优越性,枚举可以提供更好的类型安全,并且支持方法和构造函数。枚举...

    最新的java程序员不可不学的java基础教程

    10. **枚举与注解**:枚举类型提供了一种安全的常量表示方式,而注解则为编译器和运行时提供元数据,这两者都极大地丰富了Java语言的表达能力。 在《Effective Java 第二版》这本书中,作者深入浅出地介绍了许多...

    java四大名著pdf

    作者 Bruce Eckel 提倡使用面向对象的思维方式,书中涵盖了泛型、枚举、注解、Lambda表达式等现代Java特性,帮助读者理解并掌握高级编程技巧。 3. 《Effective Java》:由Joshua Bloch 编著,是Java程序员的必备...

    effecive java 中文版 第二版

    通过以上对“Effective Java 中文版 第二版”的核心知识点的总结,我们可以看到这本书覆盖了Java编程语言的各个方面,包括面向对象设计原则、类与接口的设计、对象的创建与销毁、枚举类型与注解、泛型与集合框架以及...

    LF_EffectiveJava:买的书籍看完必须把原始码运行完,加上自己的理解注释

    在LF_EffectiveJava中,可以看到如何创建枚举类型,以及如何为枚举添加方法和实现接口。 2. **构造器与工厂方法**:书中提倡使用工厂方法来创建对象,因为它可以提供更好的封装和灵活性。项目中的代码可能包含了...

    effectice java第二版

    4. **枚举和注解**:介绍了枚举类型在Java中的强大功能,如枚举常量、枚举方法、枚举开关语句等,并讲解了自定义注解的创建和使用,以及元注解的应用。 5. **方法**:提倡使用重载而非覆盖,解释了如何有效地使用...

Global site tag (gtag.js) - Google Analytics