Creo que puede ser útil para reducir el alcance de los métodos en ciertas condiciones.
Por ejemplo, lo uso en pruebas unitarias. Algunas veces necesita un método de utilidad para reducir la verbosidad de una prueba. Pero este método de utilidad puede estar relacionado con el conjunto de datos de prueba actual y no puede reutilizarse fuera de esta prueba.
@Test
public void facetting_is_impacted_by_filtering() {
// given
String userId = "cd01d6b08bc29b012789ff0d05f8e8f1";
DocumentSolrClient client = solrClientsHolder.getDocumentClient(userId);
//
final SolrDocument doc1 = createDocument(userId);
doc1.setAuthorName("AuthorName1");
doc1.setType("Type1");
doc1.setUserTags(Arrays.asList("UserTag1", "UserTag1bis","UserTag1bisbis"));
doc1.setSenderTags(Arrays.asList("SenderTag1", "SenderTag1bis"));
doc1.setCreationDate(new Date(EnumDateRange.CURRENT_DAY.getBegin().getTime()+1000));
doc1.setLocation(DocumentLocation.INBOX);
client.index(doc1);
//
final SolrDocument doc2 = createDocument(userId);
doc2.setAuthorName("AuthorName2");
doc2.setType("Type2");
doc2.setUserTags(Arrays.asList("UserTag2"));
doc2.setSenderTags(Arrays.asList("SenderTag2"));
doc2.setCreationDate(new Date(1000)); // cree il y a tres longtemps
doc2.setLocation(DocumentLocation.SAFE);
client.index(doc2);
//
final List<DateRange> facettedRanges = Arrays.<DateRange>asList(
EnumDateRange.CURRENT_DAY,
EnumDateRange.CURRENT_YEAR,
EnumDateRange.BEFORE_CURRENT_YEAR
);
class TestUtils {
ApiSearchRequest baseFacettingRequest(String userId) {
ApiSearchRequest req = new ApiSearchRequest(userId);
req.setDocumentTypeFacets(true);
req.setSenderNameFacets(true);
req.setSenderTagsFacets(true);
req.setUserTagsFacets(true);
req.addDateCreationFacets(facettedRanges);
return req;
}
void assertDoc1FacettingResult(ApiSearchResponse res) {
assertThat(res.getDocuments().size()).isEqualTo(1);
assertThat(res.getDocumentTypeFacets().get().getCounts()).hasSize(1);
assertThat(res.getSenderNameFacets().get().getCounts()).hasSize(1);
assertThat(res.getSenderTagsFacets().get().getCounts()).hasSize(2);
assertThat(res.getUserTagsFacets().get().getCounts()).hasSize(3);
assertThat(res.getDateCreationFacets().get().getCounts()).isEqualTo(computeExpectedDateFacettingResult(Arrays.asList(doc1),facettedRanges));
}
void assertDoc2FacettingResult(ApiSearchResponse res) {
assertThat(res.getDocuments().size()).isEqualTo(1);
assertThat(res.getDocumentTypeFacets().get().getCounts()).hasSize(1);
assertThat(res.getSenderNameFacets().get().getCounts()).hasSize(1);
assertThat(res.getSenderTagsFacets().get().getCounts()).hasSize(1);
assertThat(res.getUserTagsFacets().get().getCounts()).hasSize(1);
assertThat(res.getDateCreationFacets().get().getCounts()).isEqualTo(computeExpectedDateFacettingResult(Arrays.asList(doc2),facettedRanges));
}
}
TestUtils utils = new TestUtils();
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// when
ApiSearchRequest req = utils.baseFacettingRequest(userId);
ApiSearchResponse res = documentSearchService.search(req);
// then
assertThat(res.getDocuments().size()).isEqualTo(2);
assertThat(res.getDocumentTypeFacets().get().getCounts()).hasSize(2);
assertThat(res.getSenderNameFacets().get().getCounts()).hasSize(2);
assertThat(res.getSenderTagsFacets().get().getCounts()).hasSize(3);
assertThat(res.getUserTagsFacets().get().getCounts()).hasSize(4);
assertThat(res.getDateCreationFacets().get().getCounts()).isEqualTo(computeExpectedDateFacettingResult(Arrays.asList(doc1,doc2),facettedRanges));
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// when
req = utils.baseFacettingRequest(userId);
req.addLocation(DocumentLocation.SAFE);
res = documentSearchService.search(req);
// then
utils.assertDoc2FacettingResult(res);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// when
req = utils.baseFacettingRequest(userId);
req.addUserTag("UserTag1");
res = documentSearchService.search(req);
// then
utils.assertDoc1FacettingResult(res);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// when
req = utils.baseFacettingRequest(userId);
req.addSenderTag("SenderTag2");
res = documentSearchService.search(req);
// then
utils.assertDoc2FacettingResult(res);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// when
req = utils.baseFacettingRequest(userId);
req.setDocumentType("Type1");
res = documentSearchService.search(req);
// then
utils.assertDoc1FacettingResult(res);
}
En este exemple de la vida real, que podría haber hecho una clase interna regular, pero alguien podría haber tenido la tentación de volver a utilizarlo en otras pruebas, mientras que no fue diseñado para.
Por cierto, notará la capacidad de "capturar" la compilación del conjunto de datos en la prueba directamente dentro de la clase de utilidad. Usar una clase interna regular, no podría funcionar sin crear el conjunto de datos específico de la prueba fuera de la prueba también ... por lo que terminas con muchas cosas compartidas con otras pruebas, mientras se usan (deberían usarse) con solo una .
Al final, no creo que una característica que permite reducir la visibilidad es inútil.
Se puede construir una aplicación perfecta eficacia sin necesidad de utilizar la encapsulación en absoluto, y se puede discutir lo mismo, diciendo que el modificador privada es inútil ...
Pero sí, el modificador privada es sin duda más útil que el método local innerclasses;)
+1 Parece el mejor ejemplo. Todavía es bastante malo, ya que el método es demasiado extenso y el comportamiento debería colocarse mejor en la enumeración. – maaartinus
Estoy totalmente de acuerdo, el diseño huele a lo grande, y esa es probablemente la razón por la que nunca he visto a nadie hacer eso durante mis 15 años de programación en Java. – Kaj
De acuerdo. Además, para los programadores malos es demasiado alto y los buenos lo evitan. – maaartinus