Prefer class hierarchies to tagged classes. (Item 20, 21, 22)

Слайд 2

Tagged class – instances come in two or more flavors; contain

Tagged class –

instances come in two or more flavors;
contain a tag

field indicating the flavor of the instance
Слайд 3

Слайд 4

Tagged classes: Bad readability Spend to much memory (contain fields belonging

Tagged classes:

Bad readability
Spend to much memory (contain fields belonging to other

flavors)
Fields can’t be final (constructors don’t initialize irrelevant fields)
Constructors must set the tag field and initialize the right data fields – compiler can’t control this.
Type doesn’t gives a clue to its flavor.
Слайд 5

A tagged class is just imitation of a class hierarchy Refactor tagged class into a hierarchy

A tagged class is just imitation of a class hierarchy

Refactor tagged

class into a hierarchy
Слайд 6

Слайд 7

Item 21: Use function objects to represent strategies

Item 21: Use function objects to represent strategies

Слайд 8

Function object is – An instance of a class that exports

Function object is –

An instance of a class that exports exactly

one method performing operations on other objects, passed explicitly to the method
Example: Comparator
Слайд 9

Concrete strategy Comparator is concrete strategy for comparison Typical concrete strategy

Concrete strategy

Comparator is concrete strategy for comparison
Typical concrete strategy classes are

stateless: has no fields => all instances of the class are functionally equivalent => should be a singleton
Слайд 10

Concrete strategy classes are often declared as anonymous classes Note that

Concrete strategy classes are often declared as anonymous classes

Note that using

an anonymous class will create a new instance each time the call is executed

If concrete strategy used once – anonymous class
If concrete strategy is designed for repeated use:
Implementation – private static member class
Export – final public static field
Type – strategy interface

Слайд 11

Item 22: Favor static member classes over nonstatic

Item 22: Favor static member classes over nonstatic

Слайд 12

Nested classes Static member classes Nonstatic member classes Anonymous classes Local classes Inner classes

Nested classes

Static member classes

Nonstatic member classes

Anonymous classes

Local classes

Inner classes

Слайд 13

If you declare a member class that does not require access

If you declare a member class that does not require access

to an enclosing instance – always put the static modifier in its declaration
Nonstatic static member class has reference to enclosing instance:
it costs time and resources;
it makes enclosing instance not available for garbage collection.