мај 26, 2016

Канонична Форма на Јава Класа

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

Повеќето Java класи треба најмалку следните делови. Ова е надвор од било функционалност која ја опфаќа. Имињата на класи се капитализирани во Јава како конвенцијата на стил.

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.
	}
}

Речиси сите класи треба да има конструктор без аргументи. Понекогаш тоа не е логично, па тоа не е фирма услов. Ако класа нема таков конструктор, тогаш на конструкторите на сите поткласи ќе треба експлицитно да се јавите на еден од конструкторите на својата класа со супер нотација.

Ако ти се јавам на не-финалето метод на класа од конструкторот на таа класа на погрешна работа е веројатно да се случи, бидејќи објектот е сеуште во изградба, но повикувајќи полиморфна методи бара објектот да се заврши.

Методот на toString се користи од страна на влез / излез систем Јава и од страна на некои остана делови на системот Јава. Исто така е многу корисно кога наоѓање на грешки во програмата, бидејќи ако го произведува добри информации за објектот и нејзините области, на програмерот може да се види она што се случува во програма само со пишување на некои од објектите од интерес.

Вообичаената телото на еднаквите е нешто како

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

Стандардно (Цел) спроведување на еднаквите ги користи == што е референца еднаквост. Најчесто ова е во ред да се направи споредба, затоа што не се на значењето на објектот во предвид. Методот на hashCode е потребно, така што предмети може да се стави во хаш маси (Hashtable и HashMap) како клучеви. Ако hashCode не е во согласност со еднаквите, хаш табелата нема да успее да работи правилно. Ако тестот на еднаквите се базира на некои сет на полиња на класата, а потоа hashCode треба да се заснова на истите тие области. (Благодарение на Овен Astrachan на Универзитетот Дјук за посочувањето на грешка во претходната верзија.)

Тоа е исклучително важно дека вашиот метод еднаквите ги параметар од типот на објект. Ако преоптоварување на овој метод, што му дава повеќе специфични параметри, како што се чини интуитивно точни, многу работи во системот нема да може да функционира правилно. Тоа е затоа што еднаквите се нарекува со систем со код во неколку ситуации и вашиот поспецифични никогаш не ќе се вика овој начин, бидејќи динамичен полиморфизам не се користи за параметри.

Повеќето часови треба да го имплементира java.io.Serializable, која нема барања. Тоа овозможува заштеда на објектот во датотека или пренесување низ мрежата.

Повеќето часови треба да го имплементира Cloneable и имаат метод да се вратат верна копија:

public Object clone()
	{	...
	}

Стандардно овој метод е заштитен и доколку дојде ќе го фрли CloneNotSupportedException

Имајте на ум дека вие не треба да се користи конструктор да се иницијализира повеќето области. Можете да го направите тоа во декларациите – дури и ако треба да се јавите на функција да го стори тоа.

Исто така. Вашиот полиња сите треба да бидат приватни. Ако поткласи им треба пристап до некои од областите, може да се обезбеди заштитени accessors.

Забелешка за Java 2 корисници. Ако сте изградба на класа во Java 2 (Јава верзија 1.2 или понова) исто така треба да се разгледа, ако тоа е соодветно за својата класа за спроведување на Споредбени интерфејс. Ако не е така, тогаш објекти во својата класа нема да може да послужи како клучеви во TreeMaps. Ако не одлучи што е соодветно, исто така, треба да се спроведе метод

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

Овој метод враќа негативен ако тоа може да се смета за “помалку” од другите, позитивен, ако тоа е “поголем” од другите и нула, ако тие се исти. Имајте на ум дека е еднакво треба да биде во согласност со compareTo така што ако е еднакво е вистина тогаш compareTo дава нула.

Како на Java 5 повеќето класи (барем оние со предмети кои сакаат да бидат подредени), треба да ја имплементира Споредбени интерфејс (од java.lang).

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

Оваа овозможува предмети од оваа група да биде во споредба со едни со други. Ако треба да се смета како “помалку” од b тогаш a.compareTo (б) треба да се врати на негативна вредност. Општо земено, ако a.equals (б), тогаш a.compareTo (б) треба да се врати 0. Исто така a.compareTo (б) треба да имаат спротивен знак како b.compareTo (а). Всушност compareTo треба да формираат врска еквивалентност на вредностите (симетричен, преоден, и рефлексивен), како и на вкупниот цел. Тогаш методи на java.util.Collections да ги сортирате елементи автоматски кога тие се чуваат во низи, итн Тоа е исто така лесно да ги стави во подредени колекции, како што се подредени листа, иако постојат и други начини да се постигне тоа