Java (Android) Clase abstracta Implementación correcta -- java campo con android camp codereview Relacionados El problema

Java (Android) abstract class correct implementation


4
vote

problema

Español

Estoy buscando algunos comentarios en mi código y si esta es la mejor manera de crear una clase abstracta. Además, algunos de los métodos abstractos rara vez se les llama, por lo que use las variables de la base dentro de la subclase para asegurarse de que onCreateDialog selecciona las cosas correctas. Por lo tanto, el getTitle() > 0 condicional.

  public abstract class BaseDialogFragment extends DialogFragment {  // Base Variables public static final int NONE = -1; public static final int ITEM_SET = 1;  // Extras public String extraTitle = ""; public String extraMessage = ""; private View dialogView; private ListView list;  public BaseDialogFragment() {}  @Override public Dialog onCreateDialog(Bundle savedInstanceState) {     ContextThemeWrapper context = null;     String theme = ActivityPrefHandler.getTheme(getActivity());     if (theme.equals(PreferencesActivity.MATERIAL)) {         context = new ContextThemeWrapper(getActivity(), R.style.ThemeMainDialog);     } else if (theme.equals(PreferencesActivity.LIGHT)) {         context = new ContextThemeWrapper(getActivity(), R.style.ThemeLightDialog);     } else if (theme.equals(PreferencesActivity.DARK)) {         context = new ContextThemeWrapper(getActivity(), R.style.ThemeDarkDialog);     }     CustomAlertDialogBuilder builder = new CustomAlertDialogBuilder(context);     if (getIcon() > 0) {         builder.setIcon(getIcon());     }     if (getTitle() > 0) {         if (getExtraTitle().equals("")) {             builder.setTitle(getTitle());         } else {             builder.setTitle(getExtraTitle());         }     }     if (getMessage() > 0) {         if (getExtraMessage().equals("")) {             builder.setMessage(getMessage());         } else {             builder.setMessage(getExtraMessage());         }     }     if (getDialogView() > 0) {         LayoutInflater inflater = getActivity().getLayoutInflater();         dialogView = inflater.inflate(getDialogView(), null);         builder.setView(dialogView);     }     if (getPositiveButtonText() > 0) {         builder.setPositiveButton(getPositiveButtonText(), new OnClickListener() {             @Override             public void onClick(DialogInterface dialog, int which) {                 onConfirmClick();             }         });     }     if (getNeutralButtonText() > 0) {         builder.setNeutralButton(getNeutralButtonText(), new OnClickListener() {             @Override             public void onClick(DialogInterface dialog, int which) {                 onNeutralClick();             }         });     }     builder.setNegativeButton(R.string.cancel, new OnClickListener() {         @Override         public void onClick(DialogInterface dialog, int which) {             onCancelClick();         }     });     return builder.create(); }  @Override public void onDestroyView() {     extraTitle = "";     super.onDestroyView(); }  public abstract void setListener(final OnDialogConfirmed l);  public abstract int getIcon();  public abstract int getTitle();  public abstract int getMessage();  public abstract int getDialogView();  public abstract int getPositiveButtonText();  public abstract int getNeutralButtonText();  public abstract void onConfirmClick();  public abstract void onCancelClick();  public abstract void onNeutralClick();  public void setTitle(String title) {     extraTitle = title; }  public String getExtraTitle() {     if (!extraTitle.equals("")) {         return extraTitle;     } else {         return "";     } }  public void setExtraMessage(String message) {     extraMessage = message; }  public String getExtraMessage() {     if (!extraMessage.equals("")) {         return extraMessage;     } else {         return "";     } }  public void setListViewAdapter(SimpleCursorAdapter adapter) {     if (dialogView != null) {         if (dialogView.findViewById(R.id.fragment_listview) != null) {             list = (ListView) dialogView.findViewById(R.id.fragment_listview);             if (adapter != null) {                 list.setAdapter(adapter);             }         }     } }  public ListView getListView() {     return list; }  // generic methods omitted  }   
Original en ingles

I am looking for some comments on my code and whether or not this is the best way to create an abstract class. In addition, some of the abstract methods are rarely called so I use the base variables within the subclass to make sure onCreateDialog selects the correct stuff. Hence, the getTitle() > 0 conditional.

public abstract class BaseDialogFragment extends DialogFragment {  // Base Variables public static final int NONE = -1; public static final int ITEM_SET = 1;  // Extras public String extraTitle = ""; public String extraMessage = ""; private View dialogView; private ListView list;  public BaseDialogFragment() {}  @Override public Dialog onCreateDialog(Bundle savedInstanceState) {     ContextThemeWrapper context = null;     String theme = ActivityPrefHandler.getTheme(getActivity());     if (theme.equals(PreferencesActivity.MATERIAL)) {         context = new ContextThemeWrapper(getActivity(), R.style.ThemeMainDialog);     } else if (theme.equals(PreferencesActivity.LIGHT)) {         context = new ContextThemeWrapper(getActivity(), R.style.ThemeLightDialog);     } else if (theme.equals(PreferencesActivity.DARK)) {         context = new ContextThemeWrapper(getActivity(), R.style.ThemeDarkDialog);     }     CustomAlertDialogBuilder builder = new CustomAlertDialogBuilder(context);     if (getIcon() > 0) {         builder.setIcon(getIcon());     }     if (getTitle() > 0) {         if (getExtraTitle().equals("")) {             builder.setTitle(getTitle());         } else {             builder.setTitle(getExtraTitle());         }     }     if (getMessage() > 0) {         if (getExtraMessage().equals("")) {             builder.setMessage(getMessage());         } else {             builder.setMessage(getExtraMessage());         }     }     if (getDialogView() > 0) {         LayoutInflater inflater = getActivity().getLayoutInflater();         dialogView = inflater.inflate(getDialogView(), null);         builder.setView(dialogView);     }     if (getPositiveButtonText() > 0) {         builder.setPositiveButton(getPositiveButtonText(), new OnClickListener() {             @Override             public void onClick(DialogInterface dialog, int which) {                 onConfirmClick();             }         });     }     if (getNeutralButtonText() > 0) {         builder.setNeutralButton(getNeutralButtonText(), new OnClickListener() {             @Override             public void onClick(DialogInterface dialog, int which) {                 onNeutralClick();             }         });     }     builder.setNegativeButton(R.string.cancel, new OnClickListener() {         @Override         public void onClick(DialogInterface dialog, int which) {             onCancelClick();         }     });     return builder.create(); }  @Override public void onDestroyView() {     extraTitle = "";     super.onDestroyView(); }  public abstract void setListener(final OnDialogConfirmed l);  public abstract int getIcon();  public abstract int getTitle();  public abstract int getMessage();  public abstract int getDialogView();  public abstract int getPositiveButtonText();  public abstract int getNeutralButtonText();  public abstract void onConfirmClick();  public abstract void onCancelClick();  public abstract void onNeutralClick();  public void setTitle(String title) {     extraTitle = title; }  public String getExtraTitle() {     if (!extraTitle.equals("")) {         return extraTitle;     } else {         return "";     } }  public void setExtraMessage(String message) {     extraMessage = message; }  public String getExtraMessage() {     if (!extraMessage.equals("")) {         return extraMessage;     } else {         return "";     } }  public void setListViewAdapter(SimpleCursorAdapter adapter) {     if (dialogView != null) {         if (dialogView.findViewById(R.id.fragment_listview) != null) {             list = (ListView) dialogView.findViewById(R.id.fragment_listview);             if (adapter != null) {                 list.setAdapter(adapter);             }         }     } }  public ListView getListView() {     return list; }  // generic methods omitted  } 
     

Lista de respuestas

2
 
vote
vote
La mejor respuesta
 

Aquí están mis pensamientos en línea por línea:

  • Comentarios como // Base Variables es inútil, así que deshágase de ellos. Las dos primeras variables que declares son de hecho constantes y su papel es obvio de su instanciación. Sin embargo, parece que solo tiene dos papeles relacionados con un papel relacionado. Tal vez un enume sería más apropiado?

  • No es necesario para el constructor vacío.

  • El bloqueo inicial theme Id-Ose Block me frota de la manera incorrecta, aunque podría ser pedante, ya que es tan terso. Aún así, lo que preferiría ver es un Mapeo de PreferenceActivity Enum Values ​​to R.style Puede hacer una búsqueda simple, eliminar la duplicación y agregar el manejo de errores si una clave no se encuentra.

  • onCreateDialog hace muchas cosas diferentes. Puede extraer los métodos para elevar el nivel de abstracción, ya que todo lo que parece necesitado es usted 9988777665544337 objeto pasado.

  • Si puede usar Java 8, puede simplemente todos sus métodos 99887766655544338 .

  • ¿Qué son getExtraTitle y $(function(){ var ans ={ source:"../json/getmchpersonjson.php", select: function(e,u){ sysformbuild(u); }, minLength:1 }; $("#employeename").autocomplete(ans); }); 0 haciendo? Mire $(function(){ var ans ={ source:"../json/getmchpersonjson.php", select: function(e,u){ sysformbuild(u); }, minLength:1 }; $("#employeename").autocomplete(ans); }); 1 . Dice, si $(function(){ var ans ={ source:"../json/getmchpersonjson.php", select: function(e,u){ sysformbuild(u); }, minLength:1 }; $("#employeename").autocomplete(ans); }); 2 no es la cadena vacía, devuelva 99887776655443313 , de lo contrario, devuelva la cadena vacía. Eso es equivalente a solo $(function(){ var ans ={ source:"../json/getmchpersonjson.php", select: function(e,u){ sysformbuild(u); }, minLength:1 }; $("#employeename").autocomplete(ans); }); 4 .

    He usado este formato, sin embargo, pero con la consideración del hecho de que la cadena podría ser nula. En ese caso, usaría el Apache Commons-Lang LiB para hacer lo siguiente:

      $(function(){ var ans ={ source:"../json/getmchpersonjson.php", select: function(e,u){     sysformbuild(u);     },     minLength:1 }; $("#employeename").autocomplete(ans);        }); 5  
 

Here are my thoughts going line by line:

  • Comments like // Base Variables are useless, so get rid of them. The first two variables you declare are in fact constants and their role is obvious from their instantiation. It looks like you just have two performing a related role, though. Maybe an enum would be more appropriate?

  • No need for the empty constructor.

  • The initial theme if-else block rubs me the wrong way, though I might just be pedantic, since it's so terse. Still, what I would rather see is a mapping of PreferenceActivity enum values to R.style values so you can do a simple lookup, remove the duplication, and add error handling if a key isn't found.

  • onCreateDialog does a lot of different things. You can extract methods to raise the abstraction level, since all you seem to need is you CustomAlertDialogBuilder object passed in.

  • If you are able to use Java 8, you can greatly simply all of your OnClickListener methods.

  • What are getExtraTitle and getExtraMessage even doing? Look at getExtraTitle. It says, if extraTitle isn't the empty string, return extraTitle, otherwise return the empty string. That's equivalent to just return extraTitle;.

    I have used this format myself, however, but with the consideration of the fact that the string might be null. In that case, I would use the Apache commons-lang lib to do the following:

    public String getExtraTitle() {   return Strings.isNullOrEmpty(extraTitle) ? "" : extraTitle; } 
 
 
   
   

Relacionados problema

1  Clase HTTPRequest usando AsintsTask para la aplicación Android  ( Httprequest class using asynctask for android application ) 
Estoy usando la siguiente clase para recuperar una respuesta HTTP, que contiene datos para mi aplicación de Android. Todo funciona bien, pero hay un problema ...

4  FindViewByID - en clase separada  ( Findviewbyid in separate class ) 
Soy nuevo en Android y quería crear una clase que cargaría un anuncio dentro del diseño actual. Todos los diseños tienen un 9988777665544336 de mi princip...

41  ¿Es mi código un singleton 'seguro'?  ( Is my code a safe singleton ) 
Me preguntaba si mi código producirá un verdadero Singleton. Estoy creando una aplicación de Android, y todas las actividades deben acceder a mi API a través ...

2  Android Utils Class  ( Android utils class ) 
He creado una clase 99887766555443322 , que consta de progressDialog y AlertDialog : public class Utils { public static ProgressDialog dialog; ...

2  Script de grado de Android en Proyecto Multi-Módulo  ( Android gradle script in multi module project ) 
Tengo un proyecto de Android Multi-Module Construido por Gradle con el nuevo Android-Plugin 0.10 +. Todos los módulos se configuran principalmente desde el ...

0  Quiero obtener días laborables para los juegos de tiempo común desde el siguiente hashmap  ( I want to get weekdays for common time sets from the following hashmap ) 
Tengo el siguiente HashMap : HashMap<String, String> days = new HashMap<String, String>(){ days.put("MON", "9-5"); days.put("TUE", "9-4"...

2  Cálculo del riesgo de los hombres de obtener la enfermedad coronaria  ( Calculating mens risk of getting coronary heart disease ) 
Me gustaría que alguien aquí me ayude a limpiar mi código. Se trata de calcular el riesgo de los hombres de obtener una enfermedad cardíaca coronaria. Aquí e...

8  Widget de pantalla de inicio para mostrar números aleatorios  ( Home screen widget to display random numbers ) 
He creado un pequeño widget de inicio de sesión que muestra números aleatorios. Adjunto es el código. Por favor, hágamelo saber si el enfoque es bueno. htt...

1  Aplicación de Android que hace ciertas acciones en respuesta al estado de alternativa  ( Android app that makes certain actions in response to the state of toggles ) 
He escrito una aplicación de Android mediante un estudio Android que, cuando el interruptor principal está habilitado, al presionar otros interruptores o pres...

2  Función para girar al cojinete solicitado  ( Function to turn to requested bearing ) 
He estado escribiendo una función: float turnToRequestedHeading(float initialHeading, float requiredHeading, float turnRate) Sigo pensando que debe hab...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos