- 1 Bevezetés
- 1.1 terminológia megjegyzések
- 1.2 Guide notes
- 2 forrásfájl alapjai
- 2.1 fájlnév
- 2.2 fájlkódolás: UTF-8
- 2.3 speciális karakterek
- 2.3.1 szóköz karakterek
- 2.3.2 Special escape sequences
- 2.3.3 Nem-ASCII karaktereket
- 3 forrásfájl-struktúra
- 3.1 licenc vagy szerzői jogi információ, ha jelen van
- 3.2 csomagnyilatkozat
- 3.3 importálási nyilatkozatok
- 3.3.1 nem helyettesítő import
- 3.3.2 no line-wrapping
- 3.3.3 a megrendelés és a távolság
- 3.3.4 nem statikus import osztályok
- 3.4 osztály deklaráció
- 3.4.1 pontosan egy felső szintű osztály deklaráció
- 3.4.2 az osztály tartalmának rendezése
- 3.4.2.1 túlterhelés: soha nem osztott
- 4 formázás
- 4.1
- 4.1.1 fogszabályzó akkor használható, ha az opcionális
- 4.1.2 Nonempty blocks: K & R style
- 4.1.3 üres blokkok: lehet tömör
- 4.2 blokk behúzás: + 2 szóköz
- 4.3 soronként egy utasítás
- 4.4 oszlopkorlát: 100
- 4.5 Line-wrapping
- 4.5.1 hol kell megtörni
- 4.5.2 francia bekezdés folytatóvonalak legalább +4 szóköz
- 4.6 szóköz
- 4.6.1 függőleges szóköz
- 4.6.2 vízszintes szóköz
- 4.6.3 vízszintes igazítás: soha nem szükséges
- 4.7 zárójelek csoportosítása: ajánlott
- 4.8 specifikus konstrukciók
- 4.8.1 Enum osztályok
- 4.8.2 változó deklarációk
- 4.8.2.1 egy változó deklarációonként
- 4.8.2.2 szükség esetén deklarált
- 4.8.3 tömbök
- 4.8.3.1 tömb inicializátorok: lehet “blokk-szerű”
- 4.8.3.2 No C-style array declarations
- 4.8.4 Switch statements
- 4.8.4.1 behúzás
- 4.8.4.2 átesés: megjegyzés:
- 4.8.4.3 a default eset van jelen
- 4.8.5 Kommentárok
- 4.8.6.1 blokk megjegyzés stílus
- 4.8.7 módosítók
- 4.8.8 numerikus Literals
- 5 Név
- 5.1 Az összes
- 5.2 Rules by identifier type
- 5.2.1 Package names
- 5.2.2 Class names
- 5.2.3 Metódusnevek
- 5.2.4 állandó nevek
- 5.2.5 nem állandó mezőnevek
- 5.2.6 Paraméternevek
- 5.2.7 helyi változónevek
- 5.2.8 Típusú változó neve
- 5.3 Camel case: defined
- 6 Programming Practices
- 6.1 @Override: mindig használt
- 6.2 fogott kivételek: nem hagyja figyelmen kívül
- 6.3 statikus tagok: a
- 6.4 Finalizers: not used
- 7 Javadoc
- 7.1
- 7.1.1 általános forma
- 7.1.2 bekezdés
- 7.1.3 Blokkcímkék
- 7.2 az összefoglaló fragmentum
- 7.3 ahol a Javadoc-ot legalább
- 7.3.1 kivétel: magától értetődő módszerek
- 7.3.2 kivétel: felülírja a
- 7.3.4 nem kötelező Javadoc
1 Bevezetés
Ez a dokumentum a Google kódolási szabványainak teljes meghatározását szolgáljaforrás kód A Java™ programozási nyelven. A Java forrásfájlt úgy írják le, hogy inGoogle Stílus, ha csak akkor, ha betartja az itt leírt szabályokat.
mint más programozási stílus útmutatók, a tárgyalt kérdések span nem csak esztétikai kérdések offormatting, de más típusú egyezmények vagy kódolási szabványok is. Ez a dokumentum azonban elsősorban azokra a kemény-gyors szabályokra koncentrál, amelyeket egyetemesen követünk, és olyan tanácsokat ad, amelyek nem egyértelműen érvényesíthetők (akár ember, akár eszköz által).
1.1 terminológia megjegyzések
ebben a dokumentumban, hacsak másként nem tisztázzuk:
- a kifejezés osztály használják zárványosan jelenti a “rendes”osztály, enum osztály, interfész vagy annotációs típus (
@interface
). - a tag (egy osztály) kifejezést inkluzívan használják beágyazott osztály, mező, módszer vagy konstruktor jelentésére; vagyis egy osztály összes legfelső szintű tartalma, kivéve az inicializálókat és a megjegyzéseket.
- a megjegyzés kifejezés mindig végrehajtási megjegyzésekre utal. Nem használjuk a “dokumentációs megjegyzések” kifejezést, hanem a “Javadoc” közös kifejezést használjuk.”
egyéb” terminológiai megjegyzések ” időnként megjelennek a dokumentumban.
1.2 Guide notes
példa kód ebben a dokumentumban nem normatív. Ez azt jelenti, hogy míg a példáka Google stílusban vannak, lehet, hogy nem illusztrálják az egyetlen stílusos módszert a kód megjelenítésére. A példákban hozott opcionális formázási döntéseket nem szabad szabályként érvényesíteni.
2 forrásfájl alapjai
2.1 fájlnév
a forrásfájl neve a benne lévő felső szintű osztály esetérzékeny nevéből áll (ebből pontosan egy van), valamint a.java
kiterjesztésből.
2.2 fájlkódolás: UTF-8
a forrásfájlok UTF-8-ban vannak kódolva.
2.3 speciális karakterek
2.3.1 szóköz karakterek
a sor Terminátor szekvenciáján kívül az ASCII vízszintes szóközkarakter (0x20) az egyetlen szóköz karakter, amely megjelenikbárhol egy forrásfájlban. Ez azt jelenti, hogy:
- All other whitespace characters in string and character literals are escaped.
- Tab characters are not used for indentation.
2.3.2 Special escape sequences
For any character that has a special escape sequence(\b
\t
\n
\f
\r
\"
\'
and\\
), that sequenceis used rather than the corresponding octal(e.g. \012
) or Unicode(e.g. \u000a
) menekülés.
2.3.3 Nem-ASCII karaktereket
a fennmaradó nem-ASCII karaktereket, vagy a tényleges Unicode karakter(pl. a ∞
), vagy az azzal egyenértékű Unicode escape(pl. a \u221e
) használják. A választás csak attól függ, ami megkönnyíti a kód olvasását és megértését, bár a Unicode-ot a karakterláncok és a kommentek erősen elriasztják.
tipp: a Unicode escape esetben, néha még akkor is, ha actualUnicode karaktereket használnak, egy magyarázó megjegyzés nagyon hasznos lehet.
példák:
példa | |
---|---|
String unitAbbrev = "μs"; |
legjobb: tökéletesen világos, még megjegyzés nélkül. |
String unitAbbrev = "\u03bcs"; // "μs" |
megengedett, de ennek nincs oka. |
String unitAbbrev = "\u03bcs"; // Greek letter mu, "s" |
megengedett, de kínos és hajlamos a hibákra. |
String unitAbbrev = "\u03bcs"; |
szegény: az olvasónak fogalma sincs, mi ez. |
return '\ufeff' + content; // byte order mark |
: nem nyomtatható karakterek esetén használja az Escape-eket,és ha szükséges, kommentáljon. |
tipp: soha ne tegye a kódot kevésbé olvashatóvá egyszerűen attól tartva, hogy a programok esetleg nem kezelik megfelelően a nem ASCII karaktereket. Ha ez megtörténik, akkor a program hibás, és azokat rögzíteni kell.
3 forrásfájl-struktúra
a forrásfájl sorrendben:
- licenc vagy szerzői jogi információk, ha vannak
- csomagnyilatkozat
- import nyilatkozatok
- pontosan egy felső szintű osztály
pontosan egy üres sor választja el a jelen lévő egyes szakaszokat.
3.1 licenc vagy szerzői jogi információ, ha jelen van
Ha a licenc vagy a szerzői jogi információ egy fájlba tartozik, ide tartozik.
3.2 csomagnyilatkozat
a csomagnyilatkozat nincs vonalba csomagolva. Az oszlopkorlátozás (4.4.szakasz, oszlopkorlátozás: 100) nem vonatkozik a csomagnyilatkozatokra.
3.3 importálási nyilatkozatok
3.3.1 nem helyettesítő import
helyettesítő import, statikus vagy más módon, nem használják.
3.3.2 no line-wrapping
az importálási utasítások nincsenek vonalba csomagolva. Az oszlopkorlát (4.4. szakasz, oszlopkorlát: 100) nem vonatkozik az importstatementekre.
3.3.3 a megrendelés és a távolság
Import a következőképpen kerül megrendelésre:
- minden statikus import egyetlen blokkban.
- minden nem statikus import egyetlen blokkban.
ha mind statikus, mind nem statikus Importálás van, egyetlen üres sor választja el a két blokkot. Nincs más üres sor az importálási nyilatkozatok között.
minden blokkban az importált nevek ASCII rendezési sorrendben jelennek meg. (Megjegyzés: Ez nem ugyanaz, mint az ASCII rendezési sorrendben lévő importálási nyilatkozatok, mivel”.”rendezi előtt”;”.)
3.3.4 nem statikus import osztályok
statikus import nem használják statikus beágyazott osztályok. Ezek importáltnormális import.
3.4 osztály deklaráció
3.4.1 pontosan egy felső szintű osztály deklaráció
minden felső szintű osztály saját forrásfájlban található.
3.4.2 az osztály tartalmának rendezése
az osztály tagjai és kezdeményezői számára választott sorrend nagy hatással lehet A tanulhatóságra. Azonban nincs egyetlen helyes recept, hogyan kell csinálni; különböző osztályok mayorder azok tartalmát különböző módon.
ami fontos, hogy minden osztály valamilyen logikai sorrendet használjon, amit a karbantartó meg tud magyarázni, ha megkérdezi. Például az új módszereket nem csak szokásosan adják hozzá az osztály végéhez, mivel ez “időrendi hozzáadott dátum szerint” rendelést eredményezne, ami nem logikaérdeklődés.
3.4.2.1 túlterhelés: soha nem osztott
Ha egy osztály több konstruktőri, vagy több módszer, az azonos nevű, ezek appearsequentially, nincs más kódot között (sem magán tagok).
4 formázás
terminológia megjegyzés: a blokkszerű konstrukció egy osztály, módszer vagy kivitelező testére utal. Vegye figyelembe, hogy a szakasz 4.8.3.1 onarray inicializátorok, bármilyen tömb initializermay opcionálisan kell kezelni, mintha egy blokk-szerű konstrukció.
4.1
4.1.1 fogszabályzó akkor használható, ha az opcionális
zárójelek aif
else
for
do
éswhile
nyilatkozatok, még akkor is, ha a test üres, vagy csak egyetlen nyilatkozatot tartalmaz.
4.1.2 Nonempty blocks: K & R style
Braces follow the Kernighan and Ritchie style (“egyiptomi zárójelek”) for nonempty blocks and block-like constructs:
- no line break before the opening brace.
- sortörés a nyitó zárójel után.
- sortörés a záró záróelem előtt.
- sortörés a záró merevítő után, csak akkor, ha a zárójel egy nyilatkozatot zár le, vagy egy módszer, konstruktor vagy megnevezett osztály testét megszünteti. Például a zárójel után nincs sortörés, ha azt
else
vagy vessző követi.
példák:
return () -> { while (condition()) { method(); }};return new MyClass() { @Override public void method() { if (condition()) { try { something(); } catch (ProblemException e) { recover(); } } else if (otherCondition()) { somethingElse(); } else { lastThing(); } }};
néhány kivétel az enum osztályokra a 4.8.1., Enum osztályokban található.
4.1.3 üres blokkok: lehet tömör
egy üres blokk vagy blokkszerű konstrukció lehet K & r stílusban (a 4.1.2.szakaszban leírtak szerint). Alternatív megoldásként azonnal bezárható, miután megnyitották, karakterek vagy vonalszakadás nélkül ({}
), kivéve, ha az amulti-block nyilatkozat része (amely közvetlenül több blokkot tartalmaz:if/else
vagytry/catch/finally
).
példák:
// This is acceptable void doNothing() {} // This is equally acceptable void doNothingElse() { }
// This is not acceptable: No concise empty blocks in a multi-block statement try { doSomething(); } catch (Exception e) {}
4.2 blokk behúzás: + 2 szóköz
minden egyes új blokk vagy blokkszerű konstrukció megnyitásakor a behúzás két lépéssel növekszik. Amikor a blokk véget ér, a behúzás visszatér az előző behúzási szintre. A francia szintmind a kódra, mind a megjegyzésekre vonatkozik a blokk egészében. (Lásd a példát a 4.1.2. szakaszban, nem üres blokkok: K & R Stílus.)
4.3 soronként egy utasítás
minden állítást sortörés követ.
4.4 oszlopkorlát: 100
a Java kód oszlopkorlátja 100 karakter. A “karakter” bármely Unicode kódpontot jelent.Az alábbiakban felsoroltak kivételével minden olyan vonalat, amely meghaladja ezt a határértéket, vonalba kell csomagolni, amint azt az inSection 4.5, Vonalcsomagolás magyarázza.
minden Unicode kódpont egy karakternek számít, még akkor is, ha a megjelenítési szélessége nagyobb vagy kisebb. Például, ha használszfullwidth karakterek, dönthet úgy, hogy lezárja a sort korábban, mint ahol ez a szabály szigorúan megköveteli.
kivételek:
- sorok, ahol az oszlopkorlátnak való megfelelés nem lehetséges (például egy hosszú URL a Javadoc-ban, vagy egy hosszú JSNI módszer referencia).
-
package
ésimport
nyilatkozatok (lásd a 3.2.pont csomagnyilatkozatát és a 3.3. pont importálási nyilatkozatait). - parancssorok egy megjegyzés, hogy lehet vágni-and-beillesztett egy shell.
4.5 Line-wrapping
terminológia Megjegyzés: Ha a kód, amely egyébként jogosan egyetlen sort foglal el, több sorra oszlik, ezt a tevékenységet sorcsomagolásnak nevezzük.
nincs olyan átfogó, determinisztikus képlet, amely pontosan megmutatná, hogyan kell sorba csomagolni minden helyzetben. Nagyon gyakran számos érvényes módja van a sornak-ugyanazt a kódot csomagolja.
Megjegyzés: bár a tipikus oka, sortörés, hogy avoidoverflowing az oszlop, korlát, még kód, amely valóban illik a oszlop limit talán vonal csomagolva a szerző belátása szerint.
tipp: egy módszer vagy helyi változó kivonása megoldhatja a problémátnem kell sorkötegetni.
4.5.1 hol kell megtörni
a vonalcsomagolás elsődleges irányelve: inkább a szintaktikai szintaktikai szinten törik meg. Is:
- ha egy vonal megszakad egy nem hozzárendelés operátor a szünet előtt jön a szimbólum. (Vegye figyelembe, hogy ez nem ugyanaz a gyakorlat, amelyet a Google stílusban használnak más nyelvek, például a C++ vagy a JavaScript esetében.)
- Ez vonatkozik a következő “üzemeltető, mint a” szimbólumok:
- a dot elválasztó (
.
) - a két kettősponttal a referencia-módszer (
::
) - egy jel típusú kötött (
<T extends Foo & Bar>
) - egy cső a catch blokk (
catch (FooException | BarException e)
).
- a dot elválasztó (
- Ez vonatkozik a következő “üzemeltető, mint a” szimbólumok:
ha egy sor megszakad egy hozzárendelési operátornál, a szünet általában a szimbólum után következik be, de mindkét út elfogadható.
- ez vonatkozik a” hozzárendelés-operátor-szerű “vastagbélre egy továbbfejlesztett
for
(“foreach”) nyilatkozatban.
(
) kapcsolódik, amely azt követi.,
) az azt megelőző tokenhez csatlakozik.MyLambda<String, Long, Object> lambda = (String label, Long value, Object obj) -> { ... };Predicate<String> predicate = str -> longExpressionInvolving(str);
megjegyzés: a vonalcsomagolás elsődleges célja, hogy clearcode legyen, nem feltétlenül olyan kód, amely a legkisebb sorszámhoz illeszkedik.
4.5.2 francia bekezdés folytatóvonalak legalább +4 szóköz
sorcsomagolás esetén az első (minden folytatóvonal) után minden sor behúzódiklegalább +4 az eredeti sorból.
Ha több folytatóvonal van, a behúzás a +4-es szintnél is nagyobb lehet. Általában két folytatóvonal ugyanazt a behúzási szintet használja, ha és csak akkor, ha ezek szintaktikailag párhuzamos elemekkel kezdődnek.
4.6.3. szakasz a vízszintes igazításról címekaz elriasztott gyakorlat, hogy változó számú szóközt használnak bizonyos tokenek összehangolásáraelőző vonalak.
4.6 szóköz
4.6.1 függőleges szóköz
egy üres sor mindig megjelenik:
- egy osztály egymást követő tagjai vagy inicializátorai között: mezők, konstruktorok, módszerek, beágyazott osztályok, statikus inicializátorok, példány inicializátorok.
- kivétel: két egymást követő mező közötti üres sor (amelyek között nincs más kód) opcionális. Az ilyen üres sorokat szükség szerint használják a mezők logikai csoportosításának létrehozásához.
- kivétel: az enum állandók közötti üres sorokat a 4.8.1.szakasz tartalmazza.
- a dokumentum más szakaszai (például a 3.szakasz, a forrásfájl szerkezete és a 3.3. szakasz, az importálási utasítások) előírásai szerint.
egyetlen üres sor is megjelenhet bárhol, ahol javítja az olvashatóságot, például a betweenstatements, hogy a kódot logikai alszakaszokba rendezze. Üres sor az első tag előtt vagykezdeményező, vagy az osztály utolsó tagja vagy inicializálója után, nem ösztönzik a nordiscouraged-t.
több egymást követő üres sor megengedett, de soha nem szükséges (vagy ösztönözni).
4.6.2 vízszintes szóköz
azon túl, ahol a nyelv vagy más stílusszabályok megkövetelik, és az irodalom, a Megjegyzések és ajavadoc mellett egyetlen ASCII hely is csak a következő helyeken jelenik meg.
- Elválasztó minden fenntartva szó, mint például a
if
for
vagycatch
, a nyitott zárójel ((
), amely követi a sorban - Elválasztó minden fenntartva szó, például a
else
vagycatch
, a záró kapcsos zárójel (}
), amely megelőzi a vonal - Mielőtt bármilyen nyílt kapcsos zárójel (
{
), két kivétellel:-
@SomeAnnotation({a, b})
(nem tér használt) -
String x = {{"foo"}};
(nincs hely szükséges között{{
, a tétel alábbi 8)
-
- két oldalán, bináris vagy hármas operátor. Ez vonatkozik a következő “operátorszerű” szimbólumokra is:
- az ampersand konjunktív típusú kötésben:
<T extends Foo & Bar>
- a fogási blokk csöve, amely több kivételt kezel:
catch (FooException | BarException e)
- the colon (
:
) in an enhancedfor
(“foreach”) statement - :
(String str) -> str.length()
de
- a két kettősponttal (
::
) egy referencia-módszer, ami meg van írva, mint aObject::toString
- a dot elválasztó (
.
), ami meg van írva, mint aobject.toString()
- az ampersand konjunktív típusú kötésben:
- Után a
,:;
vagy a záró zárójel ()
) a leadott - két oldalán a dupla perjel (
//
) hogy kezdődik egy end-of-line hozzászólás. Itt több szóköz megengedett, de nem szükséges. - a deklaráció típusa és változója között:
List<String> list
- Opcionális egy tömb inicializátorának mindkét zárójelében
-
new int {5, 6}
ésnew int { 5, 6 }
mindkettő érvényes
-
- között a type annotation and
or
...
.
ezt a szabályt soha nem értelmezik úgy, hogy egy sor elején további helyet igényelnek vagy tiltanak; csak a belső teret érinti.
4.6.3 vízszintes igazítás: soha nem szükséges
terminológia Megjegyzés: A vízszintes igazítás aaz a gyakorlat, hogy változó számú további szóközt ad hozzá a kódhoz azzal a céllal, hogybizonyos tokenek közvetlenül az előző sorokban szereplő más tokenek alatt jelennek meg.
Ez a gyakorlat megengedett, de a Google stílus soha nem követeli meg. Nemmég a vízszintes igazítás fenntartása olyan helyeken is, ahol már használták.
itt van egy példa igazítás nélkül, majd az igazítás használatával:
private int x; // this is fineprivate Color color; // this tooprivate int x; // permitted, but future editsprivate Color color; // may leave it unaligned
tipp: az Igazítás elősegítheti az olvashatóságot, de problémákat okozjövő karbantartás. Tekintsünk egy jövőbeli változást, amelynek csak egy sort kell megérintenie. Ez a változás a korábban tetszetős formázást is ronthatja, és ez megengedett. Gyakrabban kéri a kódoló (talán te), hogy állítsa whitespace a közeli vonalak is, possiblytriggering egy lépcsőzetes sorozat reformátusok. Az egysoros változásnak most “robbanás sugara” van.”Ez a legrosszabb esetben értelmetlen elfoglaltságot eredményezhet, de a legjobb esetben még mindig rontja a verziótörténetet, lelassítja a bírálókat, és súlyosbítja az egyesülési konfliktusokat.
4.7 zárójelek csoportosítása: ajánlott
Az opcionális csoportosítási zárójeleket csak akkor kell kihagyni, ha a szerző és a véleményező egyetért abban, hogy nincs esély arra, hogy a kódot félreértelmezik nélkülük, és nem tették volna meg a kód olvasását. Nem ésszerű azt feltételezni,hogy minden olvasó rendelkezik a teljes Javaoperator elsőbbségi táblával.
4.8 specifikus konstrukciók
4.8.1 Enum osztályok
minden vessző után, amely egy enum állandót követ, a sortörés opcionális. További üres sorok (általában csak egy) is megengedettek. Ez az egyik lehetőség:
private enum Answer { YES { @Override public String toString() { return "yes"; } }, NO, MAYBE}
egy enum osztály metódusok és konstansok dokumentálása nélkül opcionálisan formattedas lehet, ha tömb inicializátor (lásd 4.8.3.1 onarray inicializátorok).
private enum Suit { CLUBS, HEARTS, SPADES, DIAMONDS }
mivel az enum osztályok osztályok, a formázási osztályok minden más szabálya érvényes.
4.8.2 változó deklarációk
4.8.2.1 egy változó deklarációonként
minden változó deklaráció (mező vagy helyi) csak egy változót deklarál: olyan deklarációkat, mint aint a, b;
nem használnak.
kivétel: Afor
hurok fejlécében több változó deklaráció is elfogadható.
4.8.2.2 szükség esetén deklarált
a helyi változókat nem szokásosan deklarálják a tároló blokk vagy blokkszerű konstrukció elején. Ehelyett a helyi változók közel vannak ahhoz a ponthoz, amelyikelőször (az okon belül) használják, hogy minimalizálják azok hatókörét. A helyi változó nyilatkozatok általában vannakkezdeményezők, vagy közvetlenül a nyilatkozat után inicializálódnak.
4.8.3 tömbök
4.8.3.1 tömb inicializátorok: lehet “blokk-szerű”
bármely tömb inicializátor opcionálisan formázható, mintha egy ” blokk-likeconstruct.”Például a következők mindegyike érvényes (nem exhustivelist):
new int { new int { 0, 1, 2, 3 0,} 1, 2,new int { 3, 0, 1, } 2, 3} new int {0, 1, 2, 3}
4.8.3.2 No C-style array declarations
A szögletes zárójelek a típus egy részét képezik, nem pedig a változót:String args
, nem / div>.
4.8.4 Switch statements
terminológia Megjegyzés: Az aswitch blokk zárójelében egy vagy több utasításcsoport található. Minden utasításcsoport egy vagy több kapcsolócímkéből áll (vagy case FOO:
vagydefault:
), amelyet egy vagy több állítás követ (vagyaz utolsó kijelentési csoport, nulla vagy több állítás).
4.8.4.1 behúzás
mint bármely más blokk esetében, a kapcsolóblokk tartalma +2.
egy kapcsoló címke után vonalszakadás következik, a behúzási szint pedig +2-gyel növekszik, pontosan akkor, ha egy blokkot nyitnak. A következő kapcsoló címke visszatér az előző beillesztéshezszint, mintha egy blokkot bezártak volna.
4.8.4.2 átesés: megjegyzés:
egy kapcsolóblokkon belül minden utasításcsoport vagy hirtelen megszűnik (egybreak
continue
return
vagy dobott kivétel), vagy egy megjegyzéssel van megjelölve, hogy a végrehajtás a következő utasításcsoportba kerül vagy folytatódhat. Az átesés gondolatát kommunikáló bármely művelet elegendő (jellemzően// fall through
). Ez a Különleges megjegyzés nem szükségesa kapcsoló blokk utolsó kijelentési csoportja. Példa:
switch (input) { case 1: case 2: prepareOneOrTwo(); // fall through case 3: handleOneTwoOrThree(); break; default: handleLargeNumber(input);}
vegye figyelembe, hogy a case 1:
után nincs szükség megjegyzésre, csak a nyilatkozatcsoport végén.
4.8.4.3 a default
eset van jelen
minden kapcsoló utasítás tartalmaz egy default
statementgroup, akkor is, ha nem tartalmaz kódot.
kivétel: a enum
típus kapcsolónyilatkozata elhagyhatjaa default
utasításcsoport, ha magában foglaljaaz adott Típus összes lehetséges értékére kiterjedő explicit eseteket. Ez lehetővé teszi az IDE-k vagy más staticanalysis eszközök számára, hogy figyelmeztetést adjanak ki, ha bármilyen eset kimaradt.
4.8.5 Kommentárok
Annotations alkalmazása egy osztály, módszer vagy kivitelező jelenik meg azonnal, miután thedocumentation blokk, valamint minden feljegyzést felsorolt egy sor saját (ez egy annotationper vonal). Ezek a sortörések nem képezik a vonalcsomagolást (Szakasz4, 5, Vonalcsomagolás), így a behúzási szint nemnövekszik. Példa:
@Override@Nullablepublic String getNameIfPresent() { ... }
kivétel: Egyetlen továbbá annotationmay helyett együtt jelenik meg az első sorban, hogy az aláírás, például:
@Override public int hashCode() { ... }
Annotations alkalmazása egy mező is megjelenik, közvetlenül azután, hogy a dokumentáció blokk, de ebben az esetben több kommentárok (esetleg kódokat) lehet felsorolt ugyanabban a sorban;például:
@Partial @Mock DataLoader loader;
nincsenek konkrét szabályok, formázás kommentárok a paraméterek a lokális változókat, vagy-típusok.
Ez a szakasz foglalkozik végrehajtási megjegyzéseket. A Javadoc-ot külön kell kezelni7. szakasz, Javadoc.
bármely sortörést tetszőleges szóköz előzhet meg, amelyet végrehajtási megjegyzés követ.Egy ilyen megjegyzés miatt a sor nem üres.
4.8.6.1 blokk megjegyzés stílus
blokk megjegyzések vannak behúzva ugyanazon a szinten, mint a környező kódot. Ezek lehetnek/* ... */
stílus vagy// ...
stílus. Többsoros/* ... */
megjegyzések esetén a következő soroknak a*
*
-val kell kezdődniük az előző sorban.
/* * This is // And so /* Or you can * okay. // is this. * even do this. */ */
a Megjegyzések nincsenek csillagokkal vagy más karakterekkel rajzolt dobozokban.
tipp: többsoros megjegyzések írásakor használja a/* ... */
stílust, ha automatikus kódformázókat szeretne, szükség esetén csomagolja be a sorokat (bekezdésstílus). A legtöbb formázó nem csomagolja újra a sorokat a// ...
stílus megjegyzésblokkokban.
4.8.7 módosítók
osztály és tag módosítók jelen esetben a Java nyelv specifikáció által ajánlott sorrendben jelennek meg:
public protected private abstract default static final transient volatile synchronized native strictfp
4.8.8 numerikus Literals
long
– értékes egész liter literals use an uppercase L
utótag, neverlowercase (to avoid confusion with the digit 1
). Például 3000000000L
helyett 3000000000l
.
5 Név
5.1 Az összes
azonosítóra vonatkozó szabályok csak ASCII betűket és számjegyeket használnak,és az alábbiakban felsorolt esetek kis számában aláhúzza. Így minden érvényes azonosító neve illeszkedik a reguláris kifejezés \w+
.
In Google Style, special prefixes or suffixes are not used. For example, thesenames are not Google Style: name_
mName
s_name
and kName
.
5.2 Rules by identifier type
5.2.1 Package names
Package names are all lowercase, with consecutive words simply concatenated together (nounderscores). For example, com.example.deepspace
, notcom.example.deepSpace
orcom.example.deep_space
.
5.2.2 Class names
Class names are written in UpperCamelCase.
az osztálynevek általában főnevek vagy főnevek. Például:Character
vagyImmutableList
. Az interfésznevek lehetnek főnevek is ornoun kifejezések (például List
), de néha melléknevek vagy melléknevek helyett (példáulReadable
).
nincsenek konkrét szabályok vagy akár jól megalapozott egyezmények az annotációs típusok elnevezésére.
A Tesztosztályok neve a vizsgált osztály nevével kezdődik, és Test
végződéssel. Például:HashTest
vagyHashIntegrationTest
.
5.2.3 Metódusnevek
Metódusnevek kisbetűvel íródnak.
A Módszernevek általában igék vagy igekifejezések. Például:sendMessage
vagystop
.
aláhúzások jelenhetnek meg a JUnit tesztmódszernevekben az thename logikai összetevőinek elválasztására, minden egyes komponenssel kisbetűvel írva.Egy tipikus minta <methodUnderTest>_<state>
, például pop_emptyStack
. Nincs Helyesmódja a vizsgálati módszerek megnevezésének.
5.2.4 állandó nevek
állandó nevek használataCONSTANT_CASE
: minden uppercaseletters, minden szó elválasztva a következő egyetlen aláhúzás. De pontosan mi az a konstans?
az állandók olyan statikus végmezők, amelyek tartalma mélyen megváltoztathatatlan, és amelyek módszerei nodetektálható mellékhatásokkal rendelkeznek. Ez magában foglalja a primitíveket, a húrokat, a megváltoztathatatlan típusokat, valamint a megváltoztathatatlan típusokat. Ha a példány megfigyelhető állapota megváltozhat, akkor nem állandó. Pusztán az a szándék, hogy soha nem mutálja az objektumot, nem elég. Példák:
// Constantsstatic final int NUMBER = 5;static final ImmutableList<String> NAMES = ImmutableList.of("Ed", "Ann");static final ImmutableMap<String, Integer> AGES = ImmutableMap.of("Ed", 35, "Ann", 32);static final Joiner COMMA_JOINER = Joiner.on(','); // because Joiner is immutablestatic final SomeMutableType EMPTY_ARRAY = {};enum SomeEnum { ENUM_CONSTANT }// Not constantsstatic String nonFinal = "non-final";final String nonStatic = "non-static";static final Set<String> mutableCollection = new HashSet<String>();static final ImmutableSet<SomeMutableType> mutableElements = ImmutableSet.of(mutable);static final ImmutableMap<String, SomeMutableType> mutableValues = ImmutableMap.of("Ed", mutableInstance, "Ann", mutableInstance2);static final Logger logger = Logger.getLogger(MyClass.getName());static final String nonEmptyArray = {"these", "can", "change"};
ezek a nevek jellemzően főnevek vagy főnevek.
5.2.5 nem állandó mezőnevek
nem állandó mezőnevek (statikus vagy más módon) íródnaka kiskerkamelcase-ben.
ezek a nevek általában főnevek vagy főnevek. Például:computedValues
vagyindex
.
5.2.6 Paraméternevek
Paraméternevek vannak írva kisbetűs.
egykarakteres paraméterneveket el kell kerülni a nyilvános módszerekben.
5.2.7 helyi változónevek
helyi változónevek vannak írva kisbetűs.
még akkor is, ha végleges és megváltoztathatatlan, a helyi változók nem tekinthetők állandóknak, és nem lehetnek állandók.
5.2.8 Típusú változó neve
Minden típusú változó neve, az egyik a két stílus:
- egyetlen nagybetűt, tetszés szerint, majd egy egységes szám (például a
E
T
X
T2
) - A nevét a forma használt osztályok (lásd az 5.2.2, Osztály neve), majd a betű
T
(példák:RequestT
FooBarT
).
5.3 Camel case: defined
néha több ésszerű módja van egy angol kifejezés camel case-ba történő konvertálására, például amikor rövidítések vagy szokatlan konstrukciók, például “IPv6” vagy “iOS” vannak jelen. Az improvepredicabilitás érdekében a Google Style a következő (majdnem) determinisztikus sémát határozza meg.
a név prózai formájával kezdve:
- konvertálja a kifejezést egyszerű ASCII-re, és távolítson el minden aposztrófot. Például a “Müller algoritmusa”lehet” Muellers algoritmus”.
- Oszd meg ezt az eredményt szavakra, hasítva a szóközökre és a fennmaradó írásjelekre (jellemzően kötőjelekre).
- ajánlott: ha bármelyik szónak már van egy hagyományos teve-case megjelenése a közös használat során, ossza meg ezt alkotóelemeire (például az “AdWords” “ad words”lesz). Vegye figyelembe, hogy egy olyan szó, mint az “iOS”, önmagában nem igazán teve esetben van; ellenez minden egyezményt, tehát ez az ajánlás nem vonatkozik.
- most kisbetűvel mindent (beleértve a betűszavakat), majd nagybetűvel csak az első karakter:
- … minden szó, hogy így felső teve esetben, vagy
- … minden szó, kivéve az első, így alacsonyabb teve esetén
- végül, csatlakozzon az összes szót egyetlen azonosítót.
vegye figyelembe, hogy az eredeti szavak burkolatát szinte teljesen figyelmen kívül hagyják. Példák:
Prose form | Correct | Incorrect |
---|---|---|
“XML HTTP request” | XmlHttpRequest |
XMLHTTPRequest |
“new customer ID” | newCustomerId |
newCustomerID |
“inner stopwatch” | innerStopwatch |
innerStopWatch |
“supports IPv6 on iOS?” | supportsIpv6OnIos |
supportsIPv6OnIOS |
“YouTube importer” | YouTubeImporter YoutubeImporter * |
*Acceptable, but not recommended.
Note: Some words are ambiguously hyphenated in the Englishlanguage: for example “nonempty” and “non-empty” are both correct, so the method namescheckNonempty
andcheckNonEmpty
are likewise both correct.
6 Programming Practices
6.1 @Override: mindig használt
a módszer van jelölve a @Override
annotationwhen it is legal. Ez magában foglalja a szuperosztály metódust felülíró osztálymódszert, az interfész metódust implementáló osztálymódszert, valamint a superinterfacemethodot újragondoló interfészmódszert.
kivétel: @Override
elhagyható, ha a szülő módszer@Deprecated
.
6.2 fogott kivételek: nem hagyja figyelmen kívül
kivéve az alábbiakat, nagyon ritkán helyes semmit tenni a caughtexceptionre adott válaszként. (A tipikus válaszok a naplózásra vonatkoznak, vagy ha “lehetetlennek” tekintik, újragondolja aztAssertionError
.)
amikor valóban helyénvaló semmilyen intézkedést tenni egy fogási blokkban, ennek okát egy megjegyzés magyarázza.
try { int i = Integer.parseInt(response); return handleNumericResponse(i);} catch (NumberFormatException ok) { // it's not numeric; that's fine, just continue}return handleTextResponse(response);
kivétel: a tesztekben a kifogott kivétel figyelmen kívül hagyható megjegyzés nélkül, ha a neveexpected
. Thefollowing egy nagyon gyakori idióma annak biztosítására, hogy a vizsgált kód nem dobja anexception a várt típusú, így egy megjegyzést felesleges itt.
try { emptyStack.pop(); fail();} catch (NoSuchElementException expected) {}
6.3 statikus tagok: a
osztály használatával minősített, ha egy statikus osztálytagra való hivatkozást minősíteni kell, akkor az adott osztály neve, nem pedig az adott osztály típusának referenciája vagy kifejezése.
Foo aFoo = ...;Foo.aStaticMethod(); // goodaFoo.aStaticMethod(); // badsomethingThatYieldsAFoo().aStaticMethod(); // very bad
6.4 Finalizers: not used
rendkívül ritka a Object.finalize
felülírása.
TIPP: Ne csináld. Ha feltétlenül szükséges, először olvassa el és értse meg a hatékony Java 7. elemet, “Kerülje el a Véglegesítőket”, nagyon óvatosan, majd ne tegye meg.
7 Javadoc
7.1
7.1.1 általános forma
a Javadoc blokkok alapvető formázása a példában látható:
/** * Multiple lines of Javadoc text are written here, * wrapped normally... */public int method(String p1) { ... }
… vagy ebben az egysoros példában:
/** An especially short bit of Javadoc. */
az alapforma mindig elfogadható. Az egysoros forma akkor helyettesíthető, ha a Javadoc blokk teljes része (beleértve a megjegyzésjelölőket is) egyetlen sorba illeszkedik. Vegye figyelembe, hogy ez csak akkor érvényes, ha nincsenek olyan blokkcímkék, mint például a @return
.
7.1.2 bekezdés
egy üres sor—azaz egy sor, amely csak az igazított vezető csillagot tartalmazza(*
) – a bekezdések között jelenik meg, majd a blokkcímkék ifpresent csoportja előtt. Minden bekezdés, de az első <p>
közvetlenül az első szó előtt van,nincs hely utána.
7.1.3 Blokkcímkék
a használt szabványos “blokkcímkék” bármelyike a @param
@return
@throws
@deprecated
, és ez a négy típus soha nem jelenik meg üres leírással. Ha egy blokkcímke nem illeszkedik egyetlen sorba, a folytatási soroknégy (vagy több) szóköz van behúzva a @
pozícióból.
7.2 az összefoglaló fragmentum
minden Javadoc blokk egy rövid összefoglaló fragmentummal kezdődik. Ez a fragmentálás nagyon fontos: a szövegnek ez az egyetlen része, amely bizonyos kontextusokban, például a Class és a metódus indexekben jelenik meg.
Ez egy töredék-főnév vagy ige kifejezés, nem teljes mondat. Nem kezdődik A {@code Foo} is a...
, vagyThis method returns...
, és nem is képez teljes imperatív sentencelike Save the record.
. A fragmentum azonban nagybetűkkel éshibázott, mintha teljes mondat lenne.
tipp: gyakori hiba az egyszerű Javadoc írása/** @return the customer ID */
formában. Ez helytelen, és /** Returns the customer ID. */
– ra kell átállítani.
7.3 ahol a Javadoc-ot legalább
használják, a Javadoc jelen van mindenpublic
osztálynál, és mindenpublic
vagyprotected
egy ilyen osztály tagja, néhány kivétellel.
további Javadoc-tartalom is jelen lehet A 7.3.4.pontban leírtak szerint, nem szükséges Javadoc.
7.3.1 kivétel: magától értetődő módszerek
a Javadoc opcionális az “egyszerű, nyilvánvaló” módszerekhez, mint például agetFoo
, olyan esetekben, amikor valóban nincs semmi más, amit érdemes mondani, de “visszaadja a foo-t”.
fontos: nem helyénvaló ezt a kivételt idézni annak igazolására, hogy egy tipikus olvasónak tudnia kell a releváns információkat. Például egy getCanonicalName
nevű módszernél ne hagyja ki a dokumentációt(azzal az indoklással, hogy csak/** Returns the canonical name. */
), ha egy tipikus olvasónak nincs ötlete, mit jelent a “kanonikus név” kifejezés!
7.3.2 kivétel: felülírja a
Javadoc nem mindig van jelen olyan módszernél, amely felülírja a supertype metódust.
7.3.4 nem kötelező Javadoc
más osztályok és tagok szükség szerint Javadoc-ot kapnak.