Questa domanda è nel contesto di un'applicazione Android scritta in Java.
Ho questa classe che esegue un'azione specifica e restituisce il risultato di tale azione con un callback implementato nell'attività in cui è stato chiamato. Questa classe dipende dal riferimento di attività corrente. Questo non è un singleton perché questa classe può essere chiamata da diverse attività.
Una soluzione ovvia potrebbe essere qualcosa di simile:
public class MyClass {
private final Activity mActivity;
private Callback mCallback;
public MyClass(Activity activity, Callback callback) {
mActivity = activity;
mCallback = callback;
}
public void initialize() {
// do something...
mCallback.onFinished();
}
public interface Callback {
void onFinished();
}
}
public class MainActivity implements MyClass.Callback {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new MyClass(this, this).initialize();
}
@Override
public void onFinished() {
// do something...
}
}
Funziona e va bene, immagino. Ma davvero non mi piace la riga new MyClass(this, this).initialize();
. Quel new
non sembra giusto.
Questo è quando ho trovato una soluzione leggermente diversa e con una piccola variazione sui parametri:
public class MyClass {
private final Activity mActivity;
private MyClass(Activity activity) {
mActivity = activity;
}
public static MyClass with(Activity activity) {
return new MyClass(activity);
}
public void initialize(Callback callback) {
// do something...
callback.onFinished();
}
public interface Callback {
void onFinished();
}
}
public class MainActivity implements MyClass.Callback {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MyClass.with(this).initialize(this);
}
@Override
public void onFinished() {
// do something...
}
}
Esegue esattamente il problema, ma anziché creare esplicitamente un'istanza con la parola chiave new
, viene creata implicitamente con il metodo statico with()
.
Forse è solo una questione di preferenza ma IMO sembra più naturale dell'uso della parola chiave new
. Forse i nomi di with
e initialize
non sono i migliori, ma cosa ne pensate di questo?
Hai una terza alternativa?