Necesito un "Ejecutable que acepte un parámetro" aunque sé que dicho ejecutable realmente no existe.
Esto puede indicar un defecto fundamental en el diseño de mi aplicación y / o un bloqueo mental en mi cerebro cansado, por lo que espero encontrar aquí algunos consejos sobre cómo lograr algo como lo siguiente, sin violar los principios fundamentales de OO:
private Runnable mOneShotTask = new Runnable(String str) {
public void run(String str) {
someFunc(str);
}
};
¿Alguna idea de cómo lograr algo como lo anterior?
Consumer<T>
.Consumer<T>
Respuestas:
Bueno, han pasado casi 9 años desde que publiqué esto originalmente y, para ser honesto, Java ha realizado un par de mejoras desde entonces. Dejaré mi respuesta original a continuación, pero no hay necesidad de que la gente haga lo que contiene. Hace 9 años, durante la revisión del código, habría cuestionado por qué lo hicieron y tal vez lo aprobó, tal vez no. Con las lambdas modernas disponibles, es irresponsable tener una respuesta tan votada que recomiende un enfoque anticuado (que, para ser justos, era dudoso al principio ...) En Java moderno, esa revisión de código sería rechazada de inmediato, y esto sería sugirió:
Como antes, detalles como manejar ese hilo de manera significativa se dejan como ejercicio para el lector. Pero para decirlo sin rodeos, si tiene miedo de usar lambdas, debería tener aún más miedo de los sistemas de subprocesos múltiples.
Respuesta original, solo porque:
Puedes declarar una clase directamente en el método
fuente
Podrías ponerlo en una función.
(Cuando usé esto, mi parámetro era un ID entero, que usé para hacer un hashmap de ID -> myRunnables. De esa manera, puedo usar el hashmap para publicar / eliminar diferentes objetos myRunnable en un controlador).
fuente
Runnable
objeto devuelto por el método en cualquier lugar,paramStr
probablemente no será elegible para la recolección de basura. Es posible que si el objeto existe pero nunca se puede ejecutar de nuevo, el JIT (o incluso javac) puede decidir eliminarlo del alcance, pero no debemos confiar en tales optimizaciones porque pueden cambiar en el futuro.Cree una función de inicio que devuelva el objeto e inicialice los parámetros con él.
fuente
Yo uso la siguiente clase que implementa la interfaz Runnable . Con esta clase puedes crear fácilmente nuevos hilos con argumentos
fuente
public RunnableArg(Object... args) { setArgs(args); }
luego describir la clase local:class ActionArg extends RunnableArg { public ActionArg(Object... arg) { super(arg); } @Override public void run() { /* getArgs() and process them */ } }
y usarlaThread t = new Thread(new ActionArg( %param_object(s)% )); t.start();
Tienes dos opciones:
Definir una clase con nombre. Pase su parámetro al constructor de la clase nombrada.
Haga que su clase anónima se cierre sobre su "parámetro". Asegúrese de marcarlo como
final
.fuente
Desde Java 8, la mejor respuesta es usar
Consumer<T>
:https://docs.oracle.com/javase/8/docs/api/java/util/function/Consumer.html
Es una de las interfaces funcionales, lo que significa que puede llamarla como una expresión lambda:
fuente
Primero me gustaría saber qué está tratando de lograr aquí para necesitar un argumento que se pase al nuevo Runnable () o al run (). La forma habitual debería ser tener un objeto Runnable que pase datos (str) a sus subprocesos estableciendo variables miembro antes de comenzar. El método run () luego usa estos valores de variables miembro para ejecutar someFunc ()
fuente