Soyut bir java sınıfına "BaseOperation" var. BaseOperation aitHem değişken dönüş türü hem de değişken giriş bağımsız değişkenlerine sahip bir java yöntemi
public abstract T execute()
{
...
return T;
}
Altsınıflar bu yöntemi uygulamak gerekir: Bu sınıf yalnızca tek soyut yöntem vardır,
public class GetUsersOperation extends BaseOperation<GetUsersResponse>
{
...
@Override
public GetUsersResponse execute()
{
...
return GetUsersResponse;
}
}
Bu BaseOperation
sınıftaki tüm ortak "operasyon" mantığı koymak için harika bir yoldur ancak hala her beton alt sınıfın execute()
yönteminin farklı bir dönüş türüne sahip olması gerekir.
Şimdi execute() yöntemlerinin değişken miktarda argümanlara sahip olmasını sağlamak için bu yapıyı değiştirmem gerekiyor.
execute(String, int)
ve başka gerekir: Örneğin bir somut alt sınıf gerektirecektir Bu zordur
execute(Date, Date, String)
, yürütme yöntemi temel sınıfta bildirildiği için. Sadece tabandaki yürütme yöntemlerini aşırı yüklemek ideal değildir. İlk olarak, aşırı yükleme miktarı çok büyük olurdu. İkincisi, her alt sınıf sadece yürütme yöntemlerinden birini kullanacak, diğerlerinin noktası nedir? Bu önemli 2'sine sahiptir Açıkçası
execute(Object... arguments)
{
String s = (String) arguments[0];
...
}
:
execute(Object... arguments)
Sonra alt sınıflara tüm argümanları downcast:
(Bence) en kolay çözüm varargs ile yürütmek yöntem bildirmek için olurdu downsides:
- Tüm tüm yayınlama işlemleri nedeniyle azaltılmış performans
execute()
yöntemlerini arama, artık herhangi bir nesne miktarı witout derleyici uyarılarını iletilebileceğinden, kesinlikle yazılmaz.
Bu dezavantajları olmayan desen veya başka çözümler var mı?
Gerekli girdi ile ilgili mantığın, ayrı bir fasülye sınıfı yerine, alt sınıfın öznitelikleri (alanlar) olarak kodlanmasını seviyorum. Bununla birlikte, uygun parametreleri ayarlamadan çalıştırmayı() çağırmamı engelleyen hiçbir şey yoktur. Bu çözülebilir mi? – user1884155
@ user1884155 Evet, işlem yapıcıdaki bağımsız değişkeni geçerek, benim düzenime bakın;) – NiziL
Ah, açıkçası. Bu çözümü 'basit' javabean çözümü üzerinde tercih ediyorum çünkü tüm parametrelerim gerekli ve yaptığım her işlem sınıfı için ek bir fasulye sınıfı sunmak istemiyorum. Teşekkürler! – user1884155