{"id":181,"date":"2016-02-07T21:40:25","date_gmt":"2016-02-08T00:40:25","guid":{"rendered":"http:\/\/gois.inf.br\/wordp\/?p=181"},"modified":"2020-05-14T20:56:58","modified_gmt":"2020-05-14T23:56:58","slug":"java-efetivo-effective-java-joshua-bloch","status":"publish","type":"post","link":"http:\/\/gois.inf.br\/wordp\/?p=181","title":{"rendered":"Java Efetivo &#8211; Effective Java (Joshua Bloch)"},"content":{"rendered":"<p class=\"western\"><b>Java Efetivo<\/b><\/p>\n<p class=\"western\"><u>Criar e destruir objetos<\/u><\/p>\n<p class=\"western\">Item 1: Considere <u><b>m\u00e9todos criadores est\u00e1ticos<\/b><\/u> ao inv\u00e9s de construtores<\/p>\n<ul>\n<li><span style=\"color: #002060;\">Diferente de construtores eles tem um nome<\/span><\/li>\n<li><span style=\"color: #002060;\">N\u00e3o \u00e9 obrigado a sempre criar um novo objeto com <\/span><span style=\"color: #002060;\"><i>new<\/i><\/span><span style=\"color: #002060;\">, cada vez que \u00e9 chamado.<\/span><\/li>\n<li><span style=\"color: #002060;\">Pode retornar um objeto de qualquer subtipo do tipo de retorno. Ex.: Retornar uma interface com classes n\u00e3o publicas (API <\/span><span style=\"color: #002060;\"><i>Collections); Service Provider Framework, JDBC<\/i><\/span><span style=\"color: #002060;\">.<\/span><\/li>\n<li><span style=\"color: #002060;\">Reduz a verbosidade da cria\u00e7\u00e3o de instancias de tipos parametrizados. (Na vers\u00e3o Java SE 7 n\u00e3o \u00e9 mais necess\u00e1rio).<\/span><\/li>\n<li><span style=\"color: #943634;\">Classes sem construtores <\/span><span style=\"color: #943634;\"><i>public<\/i><\/span><span style=\"color: #943634;\"> ou <\/span><span style=\"color: #943634;\"><i>protected<\/i><\/span><span style=\"color: #943634;\"> n\u00e3o podem ser instanciadas com subclasses.<\/span><\/li>\n<li><span style=\"color: #943634;\">Na sua leitura ele n\u00e3o \u00e9 t\u00e3o f\u00e1cil de distinguir quanto por construtores. Deve-se ter maior aten\u00e7\u00e3o no seu JavaDoc e aten\u00e7\u00e3o nos nomes dos m\u00e9todos,<\/span><\/li>\n<\/ul>\n<p class=\"western\">Item 2: Considere <u><b>Builders<\/b><\/u> quando se encontrar com muitos par\u00e2metros de constru\u00e7\u00e3o. Ex:<\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-family: 'Courier New', serif;\"><span lang=\"en-US\">NutritionFacts cocaCola = new NutritionFacts.Builder(240,8).caloris(100).sodium(35).carbohydrate(27).build();<\/span><\/span><\/p>\n<p>&nbsp;<\/p>\n<p class=\"western\">Item 3: Reforce a padr\u00e3o <i>Singleton <\/i>com um construtor privado ou o tipo enum.<\/p>\n<p class=\"western\">Item 4: Reforce objetos n\u00e3o instanci\u00e1veis com um construtor privado.<\/p>\n<p class=\"western\">Item 5: Evite a cria\u00e7\u00e3o de objetos desnecess\u00e1rios.<\/p>\n<p class=\"western\"><span style=\"font-family: 'Courier New', serif;\"><span lang=\"en-US\">public Boolean isBabyBoomer() {<\/span><\/span><\/p>\n<p class=\"western\"><span style=\"font-family: 'Courier New', serif;\"><span lang=\"en-US\"><b>\/\/Unnecessary allocation of expensive object <\/b><\/span><\/span><\/p>\n<p class=\"western\"><span style=\"font-family: 'Courier New', serif;\"><span lang=\"en-US\"><b>Calendar gmtCal = Calendar.getInstance(TimeZone.getTimeZone(\u201cGMT\u201d));<\/b><\/span><\/span><\/p>\n<p class=\"western\"><span style=\"font-family: 'Courier New', serif;\"><span lang=\"en-US\">}<\/span><\/span><\/p>\n<p class=\"western\"><span style=\"font-family: 'Courier New', serif;\"><span lang=\"en-US\">public class Person {<\/span><\/span><\/p>\n<p class=\"western\"><span style=\"font-family: 'Courier New', serif;\"><span lang=\"en-US\"> private static final Date BOOM_START;<\/span><\/span><\/p>\n<p class=\"western\"><span style=\"font-family: 'Courier New', serif;\"><span lang=\"en-US\">static {<\/span><\/span><\/p>\n<p class=\"western\"><span style=\"font-family: 'Courier New', serif;\"><span lang=\"en-US\"> Calendar gmtCal = Calendar.getInstance();<\/span><\/span><\/p>\n<p class=\"western\"><span style=\"font-family: 'Courier New', serif;\"><span lang=\"en-US\"> BOOM_START = gmCal.getTime();<\/span><\/span><\/p>\n<p class=\"western\"><span style=\"font-family: 'Courier New', serif;\"><span lang=\"en-US\"> }<\/span><\/span><\/p>\n<p class=\"western\"><span style=\"font-family: 'Courier New', serif;\"><span lang=\"en-US\">}<\/span><\/span><\/p>\n<p class=\"western\"><span style=\"font-family: 'Courier New', serif;\"><span lang=\"en-US\">}<\/span><\/span><\/p>\n<p class=\"western\">\n<p class=\"western\">Item 6: Elimine a refer\u00eancia a objetos obsoletos, n\u00e3o utilizados.<\/p>\n<p class=\"western\"><a name=\"__DdeLink__260_1586726846\"><\/a> Item 7: Evite <i>finalizers<\/i><\/p>\n<p class=\"western\">\n<p class=\"western\"><u>M\u00e9todos Comuns a todos os objetos<\/u><\/p>\n<p class=\"western\">Item 8: Sobrescreva o m\u00e9todo <i>equals<\/i> da maneira correta.<\/p>\n<p class=\"western\">Item 9: Sempre sobrescreva o m\u00e9todo <i>hashCode<\/i> quando sobrescrever <i>equals<\/i>.<\/p>\n<p class=\"western\">Item 10: Sempre sobrescreva o m\u00e9todo <i>toString<\/i>.<\/p>\n<p class=\"western\">Item 11: Sobrescrever o m\u00e9todo <i>clone<\/i> com muito cuidado e quando for estritamente necess\u00e1rio.<\/p>\n<p class=\"western\">Item 12: Considere implementar a interface <i>Comparable<\/i><\/p>\n<p class=\"western\">\n<p class=\"western\"><u>Classes e Interfaces<\/u><\/p>\n<p class=\"western\">Item 13: Minimize o acesso a classes e membros<\/p>\n<p class=\"western\">As vezes n\u00e3o h\u00e1 necessidade de criar todas as classes como p\u00fablica, ex. As classes do pacote das cole\u00e7\u00f5es, muitas classes utilizadas n\u00e3o s\u00e3o p\u00fablicas.<\/p>\n<p class=\"western\">Item 14: Em classes p\u00fablicas utilize m\u00e9todos e n\u00e3o campos p\u00fablicos.<\/p>\n<p class=\"western\">Item 15: Minimize a mutabilidade.<\/p>\n<p class=\"western\">Item 16: Previra a composi\u00e7\u00e3o ao inv\u00e9s da heran\u00e7a<\/p>\n<p class=\"western\">Principalmente se herdar de classes de outra <i>package<\/i><\/p>\n<p class=\"western\">Item 17: Projete e documente para heran\u00e7a ou ent\u00e3o pro\u00edba-a.<\/p>\n<p class=\"western\">Item 18 \u2013 Prefira interfaces ao inv\u00e9s de classes abstratas.<\/p>\n<p class=\"western\">Como a linguagem n\u00e3o permite heran\u00e7a de mais de uma classe isso pode se tornar uma limita\u00e7\u00e3o e al\u00e9m disso atrav\u00e9s de interfaces uma classe pode ser de v\u00e1rios tipos, chamado <i>mixin. <\/i><\/p>\n<p class=\"western\">Pode ser fazer uma combina\u00e7\u00e3o entre intrefaces e suas implementa\u00e7\u00f5es em classes abstratas.<\/p>\n<p class=\"western\">\n<p class=\"western\">Item 19 \u2013 O uso de interfaces somente para definir tipos<\/p>\n<p class=\"western\">O uso de interfaces para definir constantes \u00e9 um p\u00e9ssimo exemplo de uso. A sugest\u00e3o para definir constantes \u00e9 utilizar uma classe est\u00e1tica utilit\u00e1ria, al\u00e9m de <i>import <\/i>est\u00e1ticos para facilitar a programa\u00e7\u00e3o.<\/p>\n<p class=\"western\">\n<p class=\"western\">Item 20 \u2013 Prefer\u00edvel utilizar uma hierarquia de classes do que classes que contenha um atributo que definam seu tipo, <i>tagged classes<\/i><\/p>\n<p class=\"western\">\n<p class=\"western\">Item 21 \u2013 Utilizar <i>funcion objects <\/i>para representar <i>strategies<\/i><\/p>\n<p class=\"western\">Item 22 \u2013 Prefira membros de classes est\u00e1ticas ao inv\u00e9s de n\u00e3o-est\u00e1tica.<\/p>\n<p class=\"western\" align=\"justify\">Se declarar um membro de classe que n\u00e3o precise acessar a classe pai, sempre declarar como est\u00e1tica.<\/p>\n<p class=\"western\" align=\"justify\">\n<p class=\"western\" align=\"justify\"><u>Generics<\/u><\/p>\n<p class=\"western\" align=\"justify\">Item 23 \u2013 N\u00e3o utilize tipos \u201ccrus\u201d em c\u00f3digos novos<\/p>\n<p class=\"western\" align=\"justify\">Preferir a utiliza\u00e7\u00e3o de c\u00f3digo utilizando generics como a classe List&lt;E&gt;.<\/p>\n<p class=\"western\" align=\"justify\">\n<p class=\"western\" align=\"justify\">Item 24 \u2013 Elimine os \u201cunchecked warnings\u201d<\/p>\n<p class=\"western\" align=\"justify\">Evitar utilizar a sua anota\u00e7\u00e3o e se n\u00e3o for poss\u00edvel comentar e utilizar no m\u00ednimo escopo poss\u00edvel como numa vari\u00e1vel local. Evitar no m\u00e9todo e nunca utilizar no n\u00edvel de classe.<\/p>\n<p class=\"western\" align=\"justify\">\n<p class=\"western\" align=\"justify\">Item 25 \u2013 Prefira listas ao inv\u00e9s arrays<\/p>\n<p class=\"western\" align=\"justify\">Arrays s\u00e3o covariantes e listas n\u00e3o, isso garante seguran\u00e7a nos tipos de dados utilizados em tempo de compila\u00e7\u00e3o.<\/p>\n<p class=\"western\" align=\"justify\">\n<p class=\"western\" align=\"justify\">Item 26 \u2013 Prefira tipos gen\u00e9ricos<\/p>\n<p class=\"western\" align=\"justify\">Tipos gen\u00e9ricos evitam exce\u00e7\u00e3o por tipo de classe quando se utilizam cast para for\u00e7ar troca de tipo.<\/p>\n<p class=\"western\" align=\"justify\">Item 27 \u2013 Prefira m\u00e9todos gen\u00e9ricos<\/p>\n<p class=\"western\" align=\"justify\">Para evitar o uso de <i>cast<\/i> no retorno do m\u00e9todo. Aumenta a seguran\u00e7a do c\u00f3digo, deixa mais claro e mais enxuto.<\/p>\n<p class=\"western\" align=\"justify\">\n<p class=\"western\" align=\"justify\">Item 28 \u2013 Utilize <i>bounded wildcards <\/i>para incrementar a flexibilidade da API<\/p>\n<p class=\"western\" align=\"justify\">Ex: public m\u00e9todo(&lt;?extends E&gt; param)<\/p>\n<p class=\"western\" align=\"justify\">Utilizar a PECS \u2013 <i>Producer extends, consumer super<\/i><\/p>\n<p class=\"western\" align=\"justify\">N\u00e3o utilizar <i>wildcards<\/i> para retorno. Pois o c\u00f3digo de cliente tamb\u00e9m ter\u00e1 que utilizar.<\/p>\n<p class=\"western\" align=\"justify\">\n<p class=\"western\" align=\"justify\">Item 29 \u2013 Considere cont\u00eaineres heterog\u00eaneos com tipos seguros<\/p>\n<p class=\"western\" align=\"justify\">Ao inv\u00e9s de utilizar como nas classes de cole\u00e7\u00f5es, que fixam um tipo espec\u00edfico para sua utiliza\u00e7\u00e3o, ex: List&lt;String&gt; pode-se utilizar uma nova estrat\u00e9gia que define o tipo que ser\u00e1 utilizado como par\u00e2metro com a classe Class. Ex:<\/p>\n<p class=\"western\" align=\"justify\">Pode-se ter um tipo como DatabaseRow representando uma linha da tabela (o cont\u00eainer no caso) e um tipo gen\u00e9rico representando a sua chave Column&lt;T&gt;. \u00c9 um design mais sofisticado para n\u00e3o fixar o par\u00e2metro fixo da classe cont\u00eainer.<\/p>\n<p class=\"western\" align=\"justify\">\n<p class=\"western\" align=\"justify\"><u>Enums e Annotations<\/u><\/p>\n<p class=\"western\" align=\"justify\">Item 30 \u2013 Utilize <b>enum<\/b> ao inv\u00e9s de constantes <b>int<\/b><\/p>\n<p class=\"western\" align=\"justify\">Muito mais leg\u00edvel e pr\u00e1tico.<\/p>\n<p class=\"western\" align=\"justify\">\n<p class=\"western\" align=\"justify\">Item 31 \u2013 Utilizar campos de inst\u00e2ncia ao inv\u00e9s de ordinais<\/p>\n<p class=\"western\" align=\"justify\">Melhor utilizar um atributo definido num enum, do que a sua ordem para representar alguma regra no programa.<\/p>\n<p class=\"western\" align=\"justify\">\n<p class=\"western\" align=\"justify\">Item 32 \u2013 Utilize EnumSet ao inv\u00e9s de campos de bits (<i>bit fields<\/i>)<\/p>\n<p class=\"western\" align=\"justify\">Aliando a melhor funcionalidade de utilizar Enum aliada a funcionalidade de bit fields, n\u00e3o h\u00e1 necessidade de utilizar campos de bit fields.<\/p>\n<p class=\"western\" align=\"justify\">\n<p class=\"western\" align=\"justify\">Item 33 \u2013 Utilize EnumMap ao inv\u00e9s de indexa\u00e7\u00e3o ordinal<\/p>\n<p class=\"western\" align=\"justify\">Ao inv\u00e9s de utilizar o valor ordinal do Enum para um \u00edndice de array, por exemplo. Deve-se utilizar a estrutura de dados EnumMap.<\/p>\n<p class=\"western\" align=\"justify\">\n<p class=\"western\" align=\"justify\">Item 34 \u2013 Emule <i>enums<\/i> extens\u00edveis com interfaces.<\/p>\n<p class=\"western\" align=\"justify\">Pode-se criar uma interface para que um <i>Enum<\/i> implemente e assim trabalhar utilizando esta interface.<\/p>\n<p class=\"western\" align=\"justify\">\n<p class=\"western\" align=\"justify\">Item 35 \u2013 Prefira anota\u00e7\u00f5es ao inv\u00e9s de padr\u00f5es de nomes<\/p>\n<p class=\"western\" align=\"justify\">Utilizando reflex\u00e3o podemos buscar uma defini\u00e7\u00e3o utilizando uma anota\u00e7\u00e3o para verifica\u00e7\u00e3o ao inv\u00e9s de utilizar uma padr\u00e3o de nomes. Ex.:<\/p>\n<p class=\"western\" align=\"justify\">@Test no m\u00e9todos ao inv\u00e9s de testFuncio() como padr\u00e3o de nome<\/p>\n<p class=\"western\" align=\"justify\">\n<p class=\"western\" align=\"justify\">Item 36 \u2013 Sempre utilizar s a anota\u00e7\u00e3o @Override<\/p>\n<p class=\"western\" align=\"justify\">Evita BUGs no c\u00f3digo, pois em tempo de compila\u00e7\u00e3o verifica-se que deve se sobrescrever o m\u00e9todo em quest\u00e3o.<\/p>\n<p class=\"western\" align=\"justify\">Item 37 \u2013 Utilize interfaces marcadoras para defini\u00e7\u00e3o de tipos<\/p>\n<p class=\"western\" align=\"justify\">Mesmo n\u00e3o tendo m\u00e9todos uma interface pode ser utilizada para definir um tipo, chamada de interface de marcadora. Em outros casos pode-se utilizar uma anota\u00e7\u00e3o de marca\u00e7\u00e3o. Mas sempre quando se refere-se a um tipo deve se utilizar um interface de marca\u00e7\u00e3o.<\/p>\n<p class=\"western\" align=\"justify\">\n<p class=\"western\" align=\"justify\"><u>M\u00e9todos<\/u><\/p>\n<p class=\"western\" align=\"justify\">Item 38 \u2013 Valide os par\u00e2metros<\/p>\n<p class=\"western\" align=\"justify\">Item 39 \u2013 Fa\u00e7a c\u00f3pias de seguran\u00e7a quando necess\u00e1rio<\/p>\n<p class=\"western\" align=\"justify\">Fa\u00e7a uma c\u00f3pia defensiva para cada par\u00e2metro mut\u00e1vel que o construtor possui.<\/p>\n<p class=\"western\" align=\"justify\">Item 40 \u2013 Design assinaturas dos m\u00e9todos cuidadosamente<\/p>\n<p class=\"western\" align=\"justify\">&#8211; Escolha do nome do m\u00e9todo bem feita<\/p>\n<p class=\"western\" align=\"justify\">&#8211; N\u00e3o exagera no n\u00famero de m\u00e9todos, por exemplo, numa interface.<\/p>\n<p class=\"western\" align=\"justify\">&#8211; Evitar uma longa lista de par\u00e2metros<\/p>\n<p class=\"western\" align=\"justify\">&#8211; Melhor utilizar interfaces do que classes para par\u00e2metros que se refiram a tipos.<\/p>\n<p class=\"western\" align=\"justify\">&#8211; Prefira uma <b>enum<\/b> com dois tipos do um <b>boolean<\/b> como par\u00e2metro<\/p>\n<p class=\"western\" align=\"justify\">\n<p class=\"western\" align=\"justify\">Item 41 \u2013 Utilize sobrecarga de met\u00f3dos, <i>overloanding,<\/i> com cuidado.<\/p>\n<p class=\"western\" align=\"justify\"><i>Overloading<\/i>, sobrecarga de m\u00e9todos \u00e9 decidido em tempo de compila\u00e7\u00e3o. J\u00e1 o <i>overriding <\/i>que \u00e9 a sobrescrita dos m\u00e9todos nas classes filhas \u00e9 feito em tempo de execu\u00e7\u00e3o.<\/p>\n<p class=\"western\" align=\"justify\">Dica: nunca tenha dois m\u00e9todos de sobrecarga com o mesmo n\u00famero de par\u00e2metros, somente se eles tenham exatamente o esmo comportamento.<\/p>\n<p class=\"western\" align=\"justify\">\n<p class=\"western\" align=\"justify\">Item 42 \u2013 Utilize varargs com cuidado.<\/p>\n<p class=\"western\" align=\"justify\">Utilizar somente em casos em que necessite passar um n\u00famero vari\u00e1vel de par\u00e2metros.<\/p>\n<p class=\"western\" align=\"justify\">\n<p class=\"western\" align=\"justify\">Item 43 \u2013 Retorne arrays ou cole\u00e7\u00f5es vazias ao inv\u00e9s de null.<\/p>\n<p class=\"western\" align=\"justify\">A classe cliente n\u00e3o precisar utilizar dois testes para saber se a cole\u00e7\u00e3o esta vazia.<\/p>\n<p class=\"western\" align=\"justify\">\n<p class=\"western\" align=\"justify\">Item 44 \u2013 Fa\u00e7a documenta\u00e7\u00e3o de todas as APIs expostos, ou seja, est\u00e3o como publico.<\/p>\n<p class=\"western\" align=\"justify\">\n<p class=\"western\" align=\"justify\"><u>Programa\u00e7\u00e3o em Geral<\/u><\/p>\n<p class=\"western\" align=\"justify\">Item 45 \u2013 Minimize o escopo das vari\u00e1veis locais. S\u00f3 instancie uma vari\u00e1vel local quando for utiliz\u00e1-la.<\/p>\n<p class=\"western\" align=\"justify\">Item 46 \u2013 Preferia for-each loops do que os loops tradicionais. A n\u00e3o ser que o tenha que trabalhar sobre a cole\u00e7\u00e3o em quest\u00e3o como remo\u00e7\u00e3o.<\/p>\n<p class=\"western\" align=\"justify\">Item 47 \u2013 Conhe\u00e7a e use as bibliotecas padr\u00f5es do java, ao inv\u00e9s de criar as suas<\/p>\n<p class=\"western\" align=\"justify\">Item 48 \u2013 Evite utilizar <b>double <\/b>e <b>float<\/b> para resultados exatos. Como valores financeiros. At\u00e9 9 d\u00edgitos utilize <b>int<\/b>, at\u00e9 18 <b>long<\/b> e ap\u00f3s isso <b>BigDecimal.<\/b><\/p>\n<p class=\"western\" align=\"justify\">Item 49 \u2013 Prefira tipos primitivos ao inv\u00e9s das classes <i>wrapper<\/i> de primitivos. Muito cuidado para utilizar compara\u00e7\u00f5es com entre <i>wrapper<\/i>.<\/p>\n<p class=\"western\" align=\"justify\">Item 50 \u2013 Evite Strings onde outros tipos s\u00e3o mais apropriados.<\/p>\n<p class=\"western\" align=\"justify\">Item 51 \u2013 Evite a concatena\u00e7\u00e3o de strings, utilize StringBuilder.<\/p>\n<p class=\"western\" align=\"justify\">Item 52 \u2013 Referencie objetos pelas suas interfaces.<\/p>\n<p class=\"western\" align=\"justify\">Item 53 \u2013 Prefira interfaces pra reflex\u00e3o.<\/p>\n<p class=\"western\" align=\"justify\">Item 54 \u2013 Utilize m\u00e9todos nativos com cuidado.<\/p>\n<p class=\"western\" align=\"justify\">Item 55 \u2013 Otimize cuidadosamente<\/p>\n<p class=\"western\" align=\"justify\">N\u00e3o sacrifique a arquitetura em fun\u00e7\u00e3o de performance.<\/p>\n<p class=\"western\" align=\"justify\">\n<p class=\"western\" align=\"justify\">\n","protected":false},"excerpt":{"rendered":"<p>Java Efetivo Criar e destruir objetos Item 1: Considere m\u00e9todos criadores est\u00e1ticos ao inv\u00e9s de construtores Diferente de construtores eles tem um nome N\u00e3o \u00e9 obrigado a sempre criar um novo objeto com new, cada vez que \u00e9 chamado. Pode retornar um objeto de qualquer subtipo do tipo de retorno. Ex.: Retornar uma interface com [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,3],"tags":[],"class_list":["post-181","post","type-post","status-publish","format-standard","hentry","category-javaee","category-javase"],"_links":{"self":[{"href":"http:\/\/gois.inf.br\/wordp\/index.php?rest_route=\/wp\/v2\/posts\/181","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/gois.inf.br\/wordp\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/gois.inf.br\/wordp\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/gois.inf.br\/wordp\/index.php?rest_route=\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"http:\/\/gois.inf.br\/wordp\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=181"}],"version-history":[{"count":1,"href":"http:\/\/gois.inf.br\/wordp\/index.php?rest_route=\/wp\/v2\/posts\/181\/revisions"}],"predecessor-version":[{"id":182,"href":"http:\/\/gois.inf.br\/wordp\/index.php?rest_route=\/wp\/v2\/posts\/181\/revisions\/182"}],"wp:attachment":[{"href":"http:\/\/gois.inf.br\/wordp\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=181"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/gois.inf.br\/wordp\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=181"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/gois.inf.br\/wordp\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=181"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}