Hay algunos enfoques aquí:
En primer lugar, se podría llegar a un mejor nombre para la clase extends BitSet
. No, BitsetWithConversionMethods
no es un buen nombre, pero tal vez algo como ConvertibleBitSet
es. ¿Eso transmite la intención y el uso de la clase? Si es así, es un buen nombre. Del mismo modo, puede tener un HashableString
(teniendo en cuenta que no puede ampliar String
, como señala Anthony en otra respuesta). Este enfoque de denominar clases secundarias con XableY
(o XingY
, como BufferingPort
o SigningEmailSender
) a veces puede ser útil para describir la incorporación de un nuevo comportamiento.
Dicho esto, creo que hay un indicio justo en su problema (no poder encontrar un nombre) que tal vez esta no es una buena decisión de diseño, y está tratando de hacer demasiado. En general, es un buen principio de diseño que una clase debe "hacer una cosa". Obviamente, dependiendo del nivel de abstracción, se puede extender para incluir cualquier cosa, pero vale la pena pensar: hacer 'manipular el conjunto/deshacer el estado de varios bits' y 'convertir un patrón de bits a otro formato' contar como uno ¿cosa? Yo diría que (especialmente con la insinuación de que te está costando encontrar un nombre) probablemente sean dos responsabilidades diferentes. Si es así, tener dos clases terminará siendo más limpio, más fácil de mantener (otra regla es que 'una clase debe tener una razón para cambiar'; una clase para manipular + convertir tiene al menos 2 razones para cambiar), más fácil de probar en aislamiento, etc.
Así que sin conocer su diseño, sugeriría tal vez dos clases; en el ejemplo BitSet
, tenga un BitSet
y (digamos) un BitSetConverter
que es responsable de la conversión. Si usted quiere conseguir realmente de lujo, tal vez incluso:
interface BitSetConverter<T> {
T convert(BitSet in);
BitSet parse(T in);
}
entonces usted podría tener:
BitSetConverter<Integer> intConverter = ...;
Integer i = intConverter.convert(myBitSet);
BitSet new = intConverter.parse(12345);
que en realidad aísla los cambios, hace que cada convertidor diferente comprobable, etc.
(De Por supuesto, una vez que lo hagas, te recomendamos que consultes guava y consideres el uso de Function, por ejemplo, Function<BitSet, Integer>
para un caso, y Function<Integer, BitSet>
para el otro. Luego obtienes un ecosistema completo de Function
-nombre de soporte que puede ser útil)
gracias por esta muy buena respuesta! – tyrondis