Præsentation er lastning. Vent venligst

Præsentation er lastning. Vent venligst

KF04 GRAY Item 2, 12, 22, 32, 42, 52. Consider a builder when faced with many constructor parameters Item 2.

Lignende præsentationer


Præsentationer af emnet: "KF04 GRAY Item 2, 12, 22, 32, 42, 52. Consider a builder when faced with many constructor parameters Item 2."— Præsentationens transcript:

1 KF04 GRAY Item 2, 12, 22, 32, 42, 52

2 Consider a builder when faced with many constructor parameters Item 2

3 En klasse med mange valgfrie parametre, kun få er krævet. Mange varianter af constructors. Svært at vedligeholde over tid. Uoverskueligt at få overblik hvilken constructor man bør bruge (og om man kan bruge nogle af de tilgængelige). Telescoping Pattern

4 // Telescoping constructor pattern – Skalerer ikke godt! public class NutritionFacts { private final int servingSize; // (mL) required private final int servings; // (per container) required private final int calories; // optional private final int fat; // (g) optional private final int sodium; // (mg) optional private final int carbohydrate; // (g) optional public NutritionFacts(int servingSize, int servings) { this(servingSize, servings, 0); } public NutritionFacts(int servingSize, int servings,int calories) { this(servingSize, servings, calories, 0); } public NutritionFacts(int servingSize, int servings, int calories, int fat) { this(servingSize, servings, calories, fat, 0); } public NutritionFacts(int servingSize, int servings, int calories, int fat, int sodium) { this(servingSize, servings, calories, fat, sodium, 0); } public NutritionFacts(int servingSize, int servings, int calories, int fat, int sodium, int carbohydrate) { this.servingSize = servingSize; this.servings = servings; this.calories = calories; this.fat = fat; this.sodium = sodium; this.carbohydrate = carbohydrate; }

5 Parameterløs constructor ved oprettelse af objekt. Benytter setter metoder til at sætte alle krævet og valgfrie parametre. Problemer kan dog opstå – hvis man forsøger at tilgå objektet og det er i en ugyldig tilstand! JavaBeans Pattern

6 // JavaBeans Pattern public class NutritionFacts { // Parameters initialized to default values (if any) private int servingSize = -1; // Required; no default value private int servings = -1; // " " " " private int calories = 0; private int fat = 0; private int sodium = 0; private int carbohydrate = 0; public NutritionFacts() { } // Setters public void setServingSize(int val) { servingSize = val; } public void setServings(int val) { servings = val; } public void setCalories(int val) { calories = val; } public void setFat(int val) { fat = val; } public void setSodium(int val) { sodium = val; } public void setCarbohydrate(int val) { carbohydrate = val; } }

7 Bringer det bedste fra både Telescoping Constructor Pattern og JavaBeans Pattern. Kalder en constructor / statics factory med alle krævet parametre og får et Builder objekt. Benytter setter lignende metoder på builder objektet for at sætte valgfrie parametre. Sidst kan Builder objektet bygges vha. build() metoden. Builder Pattern

8 // Builder Pattern public class NutritionFacts { private final int servingSize; private final int servings; private final int calories; private final int fat; private final int sodium; private final int carbohydrate; public static class Builder { // Required parameters private final int servingSize; private final int servings; // Optional parameters - initialized to default values private int calories = 0; private int fat = 0; private int carbohydrate = 0; private int sodium = 0; public Builder(int servingSize, int servings) { this.servingSize = servingSize; this.servings = servings; }.

9 public Builder calories(int val) { calories = val; return this; } public Builder fat(int val) { fat = val; return this; } public Builder carbohydrate(int val) { carbohydrate = val; return this; } public Builder sodium(int val) { sodium = val; return this; } public NutritionFacts build() { return new NutritionFacts(this); } private NutritionFacts(Builder builder) { servingSize = builder.servingSize; servings = builder.servings; calories = builder.calories; fat = builder.fat; sodium = builder.sodium; carbohydrate = builder.carbohydrate; }

10 NutritionFacts cocaCola = new NutritionFacts.Builder(240, 8). calories(100).sodium(35).carbohydrate(27).build(); Kald ved brug af Builder Bemærk: The builder’s setter methods return the builder itself so that invocations can be chained..!

11 Item 42 Brug varargs med omtanke! Item 42

12 Varargsmetoder tager 0 eller flere argumenter af den specificerede type Fx vil sum(int... args) både bliver accepteret som sum() og sum(1,2,3) Item 42

13 Minimum antal paremetre? Undgå at kaste exceptions Eksempel: static void min(int... args) { if (args.length == 0){ throw new IllegalArgumentException("Too few arguments"); }else{ … } Dette kan omgås ved static void min(int firstArg, int... remainingArgs) Hvad skal man passe på?

14 Optimering At omdanne varargs til et array tager tid Dette kan omgås ved at overloade metoden Eksempel: foo() foo(int a1) foo(int a1, int a2) foo(int a1, int a2, int a3) foo(int a1, int a2, int a3, int... rest)

15 Refer to objects by their interfaces Item 52

16 Interface > klasser som parametertype Brugen af interface hellere end klasse når man refererer til et objekt. Parameter, retur værdier, variabler og felter bør alle deklareres som interface type. Item 52

17 Overvej dette tilfælde af Vector, som er en implementering af List interfacet. List subscribers = new Vector (); Her bruges interfacet som type Kontra.. Vector subscribers = new Vector (); Her bruges klassen som type Eksempel

18 Brugen af interface som type gør programmet mere fleksibelt. Hvis man vil ændre implementationen behøver man blot ændre klassenavnet i konstruktoren List subscribers = new ArrayList () Al anden kode ville fortsat fungere Eksempel

19 Org. Implementation kræver funktionalitet interfacet ikke kan opfylde. For eksempel hvis Vector har nogle værdier som ArrayList ikke kan opfylde Hvis der ikke findes et passende interface er det naturligvis i orden at referere til et objekt ved klassen Ulemper

20 Interface som især benyttes af klasser, hvis instanser følger en naturlig orden Alfabetisk, numerisk, kronologisk Alternativ til Object.equals() x = new BigDecimal(”1.0”); y = new BigDecimal(”1.00”); x.equals(y); // false x.compareTo(y); // true Item 12 – Comparable

21 Nested classes Static member class Nonstatic member class// indre klasse Anonymous class// -- || -- Local class// -- || -- Indre klasser kan kun eksistere sammen med en instans af den omgivende klasse. Bruger plads. Overvej Builder fra Item 2. Nested class, men static = Kan kaldes uden at instantiere omgivende klasse, Builder instantierer den selv. Item 22 – Static member classes

22 // Bit field enum constants Public class Text { public static final int STYLE_BOLD= 1 << 0; // 1 public static final int STYLE_ITALIC= 1 << 1; // 2 public static final int STYLE_UNDERLINE= 1 << 2; // 4 public void applyStyles(int styles) { … } } // Enum Set – Ny(ere), nemmere implementation Public class Text { public enum Style { BOLD, ITALIC, UNDERLINE }; public void applyStyles(Set styles) { … } } Item 32 – Enum Set


Download ppt "KF04 GRAY Item 2, 12, 22, 32, 42, 52. Consider a builder when faced with many constructor parameters Item 2."

Lignende præsentationer


Annoncer fra Google