Kanoniske form af en Java klasse

Original: http://csis.pace.edu/~bergin/patterns/CanonicalJava.html

Joseph Bergin
Pace University
berginf@pace.edu

De fleste Java-klasser har brug for mindst følgende dele. Dette er ud over enhver funktionalitet, det indkapsler. Navnene på klasser er aktiveret i Java som en stil konventionen.

public class Name extends Object implements Cloneable, java.io.Serializable
{ 	public Name()
	{	... DO NOT call non final methods from here.
	}

	public String toString()
	{	return ... 
	}

	public boolean equals(Object o)
	{	... Defines an Equivalence relation
			Reflexive: a.equals(a) must return true.
			Symmetric: If a.equals(o) then o.equals(a) as well. 
			Transitive: If a.equals(b) and b.equals(c), then a.equals(c).
		... Note that Symmetric is usually the difficult one to be sure of. 
	}

	public int hashCode()
	{	... Consistent with equals: two "equals" objects should have same hashCode result.
	}
}

 

 Næsten alle klasser skal have en konstruktør uden argumenter. Nogle gange er dette ikke logisk, så det er ikke en fast krav. Hvis en klasse ikke har sådan en konstruktør, så konstruktører i
alle underklasser skal eksplicit kalde en af de konstruktører i din klasse med super notation.
Hvis du kalder en ikke-sidste metode af en klasse fra en konstruktør af denne klasse den forkerte ting der sandsynligvis vil ske, da objektet er stadig under konstruktion, men at kalde polymorfe metoder kræver, at objektet være komplet. ToString metode benyttes af Java input / output system og visse Othe dele af Java-systemet. Det er også meget nyttigt, når at finde fejl i programmet, for hvis den producerer gode oplysninger om objektet og dens marker, kan programmøren se, hvad der foregår i et program blot ved at skrive nogle af de genstande af interesse. Den sædvanlige krop ligemænd er noget i retning

public boolean equals(Object o)
{	if(o == null) return false;
	if(getClass() != o.getClass()) return false;
	return ... depending on fields of o and this. 
}

Standardindstillingen (Object) gennemførelse af ligemænd bruger == der henvises lighed. Normalt er det forkerte sammenligning at gøre, da den ikke tager betydningen af ​​objektet i betragtning. Er nødvendig hashCode metode, så der kan sættes objekterne i hash tabeller (Hashtable og HashMap) som tasterne. Hvis hashCode er ikke i overensstemmelse med ligemænd, vil hash tabellen ikke fungere korrekt. Hvis ligeværdige test er baseret på nogle sæt felter til klassen, så hashCode bør baseres på de samme områder. (Tak til Owen Astrachan af Duke University for at påpege en fejl i en tidligere version.) Det er yderst vigtigt, at din ligemænd metode tager en parameter af typen Object. Hvis du overbelaste denne metode, giver det en mere specifik parameter, som virker intuitivt korrekt, mange ting i systemet vil ikke fungere korrekt. Dette skyldes, ligemænd kaldes af systemet kode i en hel situationer og din mere specifik man aldrig vil blive kaldt på denne måde, da dynamisk polymorfi ikke bruges på parametre. De fleste klasser bør gennemføre java.io.Serializable, som ikke har nogen krav. Den tillader at gemme objektet i en fil eller overføre det over nettet. De fleste klasser bør gennemføre Cloneable og har en metode til at returnere en tro kopi:

public Object clone() { … }

Som standard denne metode er beskyttet, og hvis kaldet vil kaste CloneNotSupportedException Bemærk at du ikke behøver at bruge konstruktøren at initialisere de fleste områder. Du kan gøre dette i de erklæringer – selv hvis du har brug for at kalde en funktion til at gøre det. Også. Dine marker bør alle være privat. Hvis underklasser skal have adgang til nogle af felterne, kan du give beskyttede Adgangsmetoder. BEMÆRK til Java 2 brugere. Hvis du er ved at opbygge en klasse i Java 2 (Java version 1.2 eller nyere), bør du også overveje, om det er hensigtsmæssigt for din klasse at gennemføre Sammenlignelige grænseflade så godt. Hvis den ikke gør, så objekter i din klasse, vil ikke være i stand til at tjene som nøgler i Treemaps. Hvis du beslutter det er hensigtsmæssigt skal du også gennemføre den metode

public int compareTo(Object other)
{	...
}

Denne metode returnerer en negativ, hvis dette kan anses for at være “mindre” end andre, positivt, hvis det er “større” end andre, og nul, hvis de er de samme. Bemærk, der er lig bør være i overensstemmelse med compareTo så hvis lig er sandt, så compareTo giver nul. Som Java 5 fleste klasser (i det mindste de med objekter, der ønsker at være sorterbar), bør gennemføre de sammenlignelige grænseflade (fra java.lang).

	class Foo implements Comparable<Foo>{
		int compareTo(Foo value){
			...
		}

} Dette tillader objekter af denne klasse skal sammenlignes med hinanden. Hvis en skal opfattes som “mindre” end b da a.compareTo (b) skal returnere en negativ værdi. Generelt hvis a.equals (b), derefter a.compareTo (b) skal returnere 0. Også a.compareTo (b) have modsat fortegn som b.compareTo (a). Faktisk compareTo bør danne en ækvivalensrelation på værdierne (symmetrisk, transitive, og refleksiv) samt en samlet ordre. Så metoderne til java.util.Collections kan sortere elementerne automatisk, når de opbevares i arrays, etc. Det er også let at sætte dem ind sorteret samlinger, såsom sorteret liste, selv om der er andre måder at opnå det.

 
 

Comments are closed.