¿Cómo restablecer el objeto actual en Java? -- java campo con object campo con this campo con reset camp Relacionados El problema

How to reset current object in Java?


8
vote

problema

Español

Si tengo un objeto myObject de tipo Foo, mientras que dentro de MyObject, ¿hay una manera de reiniciarse y ejecutar el constructor nuevamente?

Sé que lo siguiente no funciona, pero podría ayudar a transmitir la idea.

  this = new Foo();   
Original en ingles

If I have an object myObject of type Foo, while inside myObject, is there a way to reset itself and run the constructor again?

I know the following does not work, but might help convey the idea.

this = new Foo(); 
           
   
   

Lista de respuestas

15
 
vote

No hay forma de ejecutar un constructor nuevamente en una instancia existente. Sin embargo, puede organizar su código de manera que permita restablecerse con una cantidad mínima de trabajo, como este:

  autocomplete()8  

Nota: su método de reinicio debe configurar todos los campos, no solo los que generalmente establece en el constructor. Por ejemplo, su constructor puede confiar en la inicialización predeterminada de los campos de referencia a autocomplete()9 y los campos numéricos a cero; El método public class MainActivity extends ActionBarActivity { Button testButton; TextView results; private static final String LOG_TAG = "PlacesAPI"; private static final String PLACES_API_BASE = "https://maps.googleapis.com/maps/api/place"; private static final String TYPE_AUTOCOMPLETE = "/autocomplete"; private static final String OUT_JSON = "/json"; private static final String API_KEY = "my-api-key-here"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); results = (TextView) findViewById(R.id.result); testButton = (Button) findViewById(R.id.button); testButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { new GetAutocompleteAsync().execute(); } }); } class GetAutocompleteAsync extends AsyncTask<String, String, ArrayList<String>>{ @Override protected ArrayList<String> doInBackground(String... params) { ArrayList<String> results = autocomplete("San Francisco"); return results; } @Override protected void onPostExecute(ArrayList<String> resultArrayList) { if (resultArrayList != null) { results.setText(resultArrayList.toString()); } } } public static ArrayList autocomplete(String input) { ArrayList resultList = null; HttpURLConnection conn = null; StringBuilder jsonResults = new StringBuilder(); try { StringBuilder sb = new StringBuilder(PLACES_API_BASE + TYPE_AUTOCOMPLETE + OUT_JSON); sb.append("?key=" + API_KEY); sb.append("&input=" + URLEncoder.encode(input, "utf8")); URL url = new URL(sb.toString()); conn = (HttpURLConnection) url.openConnection(); InputStreamReader in = new InputStreamReader(conn.getInputStream()); int read; char[] buff = new char[1024]; while ((read = in.read(buff)) != -1) { jsonResults.append(buff, 0, read); } } catch (MalformedURLException e) { Log.e(LOG_TAG, "Error processing API URL", e); return resultList; } catch (IOException e) { Log.e(LOG_TAG, "Error connecting to Places API", e); return resultList; } finally { if (conn != null) { conn.disconnect(); } } try { JSONObject jsonObj = new JSONObject(jsonResults.toString()); JSONArray predsJsonArray = jsonObj.getJSONArray("predictions"); resultList = new ArrayList(predsJsonArray.length()); for (int i = 0; i < predsJsonArray.length(); i++) { System.out.println(predsJsonArray.getJSONObject(i).getString("description")); System.out.println("============================================================"); resultList.add(predsJsonArray.getJSONObject(i).getString("description")); } } catch (JSONException e) { Log.e(LOG_TAG, "Cannot process JSON results", e); } return resultList; } } 0 debe configurarlos explícitamente.

 

There is no way to run a constructor again on an existing instance. However, you can organize your code in a way to allow resetting with a minimum amount of work, like this:

public class MyClass {     public MyClass() {         reset();     }     public void reset() {         // Setup the instance         this.field1 = ...         this.field2 = ...     } } 

Note: your reset method needs to set all fields, not just the ones that you usually set in the constructor. For example, your constructor can rely upon the default initialization of reference fields to null and numeric fields to zero; your reset method needs to set them all explicitly.

 
 
 
 
6
 
vote

Es mejor establecer NULL o usar un nuevo objeto ()

  obj = null;    or obj = new Object();   

El recolector de basura borrará el objeto finalmente

 

It is better to set null or use new Object()

obj = null;    or obj = new Object(); 

The garbage collector will clear the object finally

 
 
2
 
vote

Un enfoque alternativo, que está ganando popularidad porque tiende a hacer que el código sea más fácil de razonar, es hacer que sus objetos sean inmutables , y en lugar de cambiar su estado (por ejemplo, restablecerlos), simplemente Crea un nuevo objeto.

 

An alternative approach, which is gaining in popularity because it tends to make code easier to reason about, is to make your objects immutable, and instead of changing their state (e.g. resetting them), simply create a new object.

 
 
1
 
vote

Simplemente escriba un método que "restablece" todas las variables de su objeto (NULL o 0 o valor predeterminado).

 

Just write a method that will "reset" all the variables of your object (null or 0 or default value).

 
 
   
   
1
 
vote

Tener un conjunto de valores o estados predeterminados para su clase almacenada dentro de ella. Luego escriba un método convert()1 que restaurará todos estos valores predeterminados dentro de la clase.

  public void reset(){     // Reset everything to your default values }   
 

Have a set of default values or states for your class stored inside of it. Then write a reset() method that will restore all of these defaults within the class.

public void reset(){     // Reset everything to your default values } 
 
 
0
 
vote
  @SuppressWarnings({ "unchecked" }) static void emptyObject(Object obj)  {      Class c1 = obj.getClass();      Field[] fields = c1.getDeclaredFields();       for(Field field : fields)      {           try           {                if(field.getType().getCanonicalName() == "boolean")                {                     field.set(obj, false);                }                else if(field.getType().getCanonicalName() == "char")                {                     field.set(obj, 'u0000');                }                else if((field.getType().isPrimitive()))                {                     field.set(obj, 0);                }                else                {                     field.set(obj, null);                }           }           catch(Exception ex)           {            }      }}   
 
@SuppressWarnings({ "unchecked" }) static void emptyObject(Object obj)  {      Class c1 = obj.getClass();      Field[] fields = c1.getDeclaredFields();       for(Field field : fields)      {           try           {                if(field.getType().getCanonicalName() == "boolean")                {                     field.set(obj, false);                }                else if(field.getType().getCanonicalName() == "char")                {                     field.set(obj, '\u0000');                }                else if((field.getType().isPrimitive()))                {                     field.set(obj, 0);                }                else                {                     field.set(obj, null);                }           }           catch(Exception ex)           {            }      }} 
 
 

Relacionados problema

25  Incremento de identidad de restablecimiento de SQL Server para todas las tablas  ( Sql server reset identity increment for all tables ) 
Básicamente, necesito restablecer el incremento de identidad para todas las tablas a su original. Aquí intenté un código, pero falla. http://pastebin.com/k...

4  Cómo restablecer un panel Ver en el cine 4d  ( How to reset a view pane in cinema 4d ) 
Soy nuevo en el cine 4D y he construido un modelo que es fácilmente visible en mi derecho, superior y ventanas delanteras, pero en vista en perspectiva, no pu...

1  Reiniciar el juego de lienzo HTML5  ( Reset html5 canvas game ) 
En este momento, actualmente tengo un juego que dibuja los asteroides y el fondo, la puntuación, etc. y una vez que el barco llega a un asteroide, lleva al us...

15  ¿Deshacerse de las reglas de STYLES DE AGENTES DE USUARIO?  ( Getting rid of user agent stylesheet rules ) 
Algo extraño está sucediendo en mi Chome 12. Descargué la última placa de calderas hace unos días y diseñé en él. Todo estaba bien. 5 minutos, Chrome (web...

2  Elemento de entrada HTML: escriba "Restablecer", sin borrar el formulario siempre  ( Html input element type reset not clearing form always ) 
Tengo una interfaz de búsqueda simple: un formulario con pocos campos de entrada y botón de envío. Para borrar el texto o los valores de los campos de entrada...

1  En UWP, ¿cómo puedo restablecer los datos de una aplicación?  ( In uwp how can i reset an app s data ) 
Sé que para restablecer los datos de una aplicación, tengo que abrir la aplicación Configuración desde el menú Inicio. Diríjase al sistema & gt; Aplicaciones ...

0  ¿El comando de restablecimiento de% le restablece todas las variables de los cuadernos de JUPYTER?  ( Does reset command clear all the jupyter notebooks stocked variables ) 
hace %reset Comando Borrar todas las cuadernos de JUPYTER Variables almacenadas o solo las que están surtidas en el cuaderno actual? Quiero liberar toda l...

1  Configuración de un combobox para null en botón Presione, C #. red, mvvm  ( Setting a combobox to null on button press c net mvvm ) 
Básicamente tengo dos comboboxes. Inicialmente, cuando ingresa la pantalla, los dos comboboxes están configurados en NULL y funciona correctamente. Luego, el ...

20  ¿Por qué a veces veo un nombre de archivo de "entrada" no uptodate? No se puede fusionar ". Después de un 'git reiniciado --Hard' y un 'git tire'?  ( Why do i sometimes see an entry filename not uptodate cannot merge after a ) 
ocasionalmente, cuando hago lo siguiente ... git reset --hard HEAD is now at 0123abde comment is here git pull Updating 0123abde..456789fa obtengo e...

1  WebForms ASP.NET Sistema de identidad Restablecer contraseña  ( Webforms asp net identity system reset password ) 
¿Cómo puedo obtener la contraseña de un usuario en el nuevo sistema de identidad ASP.NET utilizando formas web? O ¿cómo puedo restablecer sin saber la actual ...




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