public HttpResponse doResourceBundle(StaplerRequest request) {
String baseName = request.getParameter("baseName");
if (baseName == null) {
return HttpResponses.errorJSON("Mandatory parameter 'baseName' not specified.");
}
String language = request.getParameter("language");
String country = request.getParameter("country");
String variant = request.getParameter("variant");
if (language != null) {
String[] languageTokens = language.split("-|_");
language = languageTokens[0];
if (country == null && languageTokens.length > 1) {
country = languageTokens[1];
if (variant == null && languageTokens.length > 2) {
variant = languageTokens[2];
}
}
}
try {
Locale locale = request.getLocale();
if (language != null && country != null && variant != null) {
locale = new Locale(language, country, variant);
} else if (language != null && country != null) {
locale = new Locale(language, country);
} else if (language != null) {
locale = new Locale(language);
}
return HttpResponses.okJSON(ResourceBundleUtil.getBundle(baseName, locale));
} catch (Exception e) {
return HttpResponses.errorJSON(e.getMessage());
}
}
public ArrayList<T> breadthFirstSearch (T source, T destination) {
ArrayList<T> bfsPath = new ArrayList<>();
Set<T> visited = new HashSet<>();
ArrayList<T> queue = new ArrayList<>();
queue.add(source);
bfsPath.add(source);
visited.add(source);
int flag = 0;
while (! queue.isEmpty()) {
source = queue.get(0);
queue.remove(0);
ArrayList<T> temp = new ArrayList<>();
if (adj.containsKey(source) && adj.get(source).size() > 0) {
temp.addAll(adj.get(source));
}
for (int i = 0; i < temp.size(); i++) {
if (! visited.contains(temp.get(i))) {
bfsPath.add(temp.get(i));
if (temp.get(i).equals(destination)) {
flag = 1;
break;
}
queue.add(temp.get(i));
visited.add(temp.get(i));
}
}
if (flag == 1) {
break;
}
}
if (flag == 0) {
return null;
}
return bfsPath;
}
public static boolean solucionar(int [][]tablero) {
int x=0,y=0;
boolean encontrado = false;
for(x = 0;x < 9; x ++) {
for(y = 0;y < 9; y++) {
if(tablero[x][y] == 0) {
encontrado = true;
break;
}
}
if( encontrado ) break;
}
if(!encontrado) return true;
boolean digitos[] = new boolean[11];
for(int i = 0; i < 9; i++) {
digitos[tablero[x][i]] = true;
digitos[tablero[i][y]] = true;
}
int bx = 3 * (x/3), by = 3 * (y/3);
for(int i =0;i<3;i++)
for(int j = 0; j < 3; j++)
digitos[tablero[bx+i][by+j]] = true;
for(int i = 1 ; i <= 9; i++) {
if(!digitos[i] ) {
tablero[x][y] = i;
if(solucionar(tablero))
return true;
tablero[x][y] = 0;
}
}
return false;
}
boolean esMúltiplo(int a, int b) {
return a % b == 0;
}
boolean esPar(int n) {
return esMúltiplo(n, 2);
}
boolean esImpar(int n) {
return !esPar(n);
}
boolean esBisciesto(int año) {
return esMúltiplo(año, 4) &&
(!esMúltiplo(año, 100) ||
esMúltiplo(año, 400));
}
public String foo() {
Map<String, String> properties = getProperties();
String bar = properties.get("fizzbuzz");
FooBar fooBar = new FooBar(bar);
Baz baz = fooBar.getBaz();
return baz.obtenerUnString();
}
En vez de
public String foo() {
Baz baz = unBaz();
return baz.obtenerUnString();
}
private Baz unBaz() {
Map<String, String> properties = getProperties();
String bar = properties.get("fizzbuzz");
FooBar fooBar = new FooBar(bar);
return fooBar.getBaz();
}
Escribir
/**
* Indica si un año es bisciesto o no.
*
* Un año bisciesto es múltiplo de 4 y si
* es múltiplo de 100 también debe serlo de 400.
*
* El año 1000 es múltiplo de 4 y de 100,
* por lo tanto no es bisciesto.
* El año 2000 es múltiplo de 4 y de 100
* pero también de 400 por lo tanto es bisciesto.
* El año 1996 es múltiplo de 4 y no de 100,
* por lo tanto es bisciesto.
*
* @param año un número natural mayor que 1
* @return true si el año es bisciesto,
* false en caso contrario.
*/
public static boolean esBisciesto(int año) {
if (año < 1) {
throw new IllegalArgumentException("Año no puede < 1");
}
return esMúltiplo(año, 4) &&
(!esMúltiplo(año, 100) ||
esMúltiplo(año, 400));
}
@Test
public void elAño1996PorSerMúltiploDe4YNoDe100EsBisciesto() {
assertThat(Fechas.esBisciesto(1996), is(true));
}
@Test
public void elAñoMilPorSerMúltiploDe4YDe100NoEsBisciesto() {
assertThat(Fechas.esBisciesto(1000), is(false));
}
@Test
public void elAñoDosMilPorSerMúltiplosDe4yDe400SiEsBisciestos() {
assertThat(Fechas.esBisciesto(2000), is(true));
}
void duplicar(int n) {
n *= 2;
}
int n = 1;
duplicar(n);
System.out.println(n); // ???
class N {
int valor = 1;
}
void duplicar(N x) {
n.x *= 2;
}
N x = new N();
System.out.println(x);
N x = new N();
System.out.println(x.valor); // ???
void duplicar(N x) {
x.valor *= 2;
}
int x; // mejor espera a
// poderle dar un valor
String s = null;
if (/* una condición */) {
s = /* algo */;
} else {
// mucho código
s = /* algo más */;
}
Excusa #1
String s = getS();
* * *
private String getS() {
if (/* una condición */) {
return /* algo */;
} else {
// mucho código
return /* algo más */;
}
}
Solución
String s = null;
for (int veces = 1; veces <= total: ++veces) {
s = cosas[i];
// código que usa s
}
Excusa #2
for (int veces = 1; veces <= total: ++veces) {
String s = cosas[i];
// código que usa s
}
Solución
El compilador optimiza el código
Date date = new Date();
foo(date);
System.out.println(date);
¿Qué fecha se imprime?
HttpServlet miServlet = new HttpServlet();
error: HttpServlet is abstract; cannot be instantiated
public T foo() {
T t = null;
if (/* algo */) {
t = ...; // El caso trivial
} else {
// mucho código
t = ...;
}
return t;
}
public T foo() {
T t = null;
if (/* algo */) {
t = ...; // El caso trivial
// Alguien pone código aquí
// modifica el valor de T,
// introduciendo bugs
} else {
// mucho código
t = ...;
}
return t;
}
public T foo() {
if (/* !algo */) {
return ...;
} else {
// varias líneas
// de código
// para calcular
// un valor de retorno
return ...;
}
}
public T foo() {
T t = null;
try {
// código
t = ...;
} catch (FiFaiFuException e) {
t = ...; // Valor por defecto
}
return t;
}
public T foo() {
try {
// código
t = ...;
return t;
} catch (FiFaiFuException e) {
return ...; // Valor por defecto
}
}
public T foo(/* parámetros */) {
try {
return doFoo(/* (¿otros?) parámetros */);
} catch(UnaExcepción e | OtraExcepción e1) {
// manejo de ambas excepciones
} catch(AlgunaExcepción e) {
// manejo de esta excepción
}
}
private T doFoo(/* some argmuments */) throws AnException,
OtherException, SomeException {
// Clean Code!
Bar bar = foo.do(); // lanza UnaExcepción
bar.baz(); // lanza OtraException
if (bar.isBlitz()) {
bar.platz(); // lanza AlgunaException
}
return bar.doo();
}
public void foo() {
T t = ...;
try {
// lógica del método
// puede lanzar una excepción
} catch (MiExcepción e) {
// t sólo es visible si
// está por fuera del try
LOGGER.info("Algo fallo con {}", t);
}
}
public void foo() {
T t = ...;
algoPeligroso(t);
}
private void algoPeligroso(T t) {
try {
// uso t, posiblemente lanza
} catch (MiExcepción e) {
LOGGER.info("Algo fallo con {}", t);
}
}
public String getDescripción(Map<String, String> data,
String id) {
if (data == null) {
return "";
}
String descripción = data.get(id);
if (descripción == null) {
return "";
}
return descripción;
}
public String getDescripción(Map<String, String> data,
String id) {
// Puede lanzar NPE
String descripción = data.get(id);
if (StringUtil.isEmpty(descripción)) {
throw new
AssertionError("Descripción vacía para id " + id);
}
return descripción;
}
for (int veces = 1; veces <= total; ++veces) {
// para ciclos que repiten instrucciones
}
for (int n = 2; n <= total; n += 2) {
// para ciclos que repiten instrucciones
}