Dinamik Java Binding

2 Cevap java

PHP bu şekilde dinamik Binding yapmaya alışkınım

function ($className)
{
 $obj = new $className();
 .
 .
 .
}

Burada SınıfAdı bir String parametre olduğunu ve bu sınıfın bir nesnesi oluşturulur sınıfın adına göre $. Ben daha fazla işlevsellik eklemek gerekir Yani ben sadece başka bir sınıfını eklemek ve her şey otomatik olarak dizildi.

Şimdi Java benzer bir şey yapmak istiyorum. Şu anda benim kod

public EditPart createEditPart(EditPart context, Object model) {

AbstractGraphicalEditPart part = null;

if(model instanceof Entreprise) {
part = new EntreprisePart();
else if(model instanceof Employee)
part = new EmployeePart();
.
.
.

}

My aim is that if I add a new Class to the package, I shouldn't have the need to modify my createEditPart function. How is it done in Java.

2 Cevap

Bir seçenek sınıfların her kendilerini kayıt edebilir ve daha sonra uygun nesne oluşturmak için denebilecek bir factory yaratmaktır.

Bir bu işlemek için bir yol, ya da en azından PHP bahsediyoruz aynı şeyi yapmak, yansımasıdır. Sen tam nitelikli bir sınıf adı belirten bir dize gelen bir Class nesne elde ve dinamik kendisi yeni bir örneğini oluşturmak için bu sınıfı kullanabilirsiniz.

public EditPart createEditPart(String name) throws [lots of stuff] {
    return Class.forName(name).asSubclass(EditPart.class).newInstance();
}

Ancak, bu Java kullanmak için nispeten verimsiz bir yoldur, ve ben mutlaka bunu tavsiye etmem. Diğer bazı diller (PHP gibi) oldukça liberal yansıması kullanmak, ama Java ile çok değil. Amber'in fabrika fikri iyi biridir ve bunu yaparken sanki, ben o ile gitmek olabilir.

Eğer oluşturmak istiyorsanız sizin EditPart yerine EditPart altsınıfın adına daha (kod örneğindeki gibi) model nesne sınıfına dayanan , o zaman yansıma kullanamazsınız. Evet, yapabilirsiniz, ama yine EditPart modelin hangi tip karşılık programı anlatmak için bir yol gerekir. Bir seçenek, bazı arayüzü Object den model parametresinin türünü değiştirmek olacaktır, bir döndüren bir yöntem olması yazardı ki, EditModel söylüyor Uygun parçası örneği. Şöyle:

public interface EditModel {
    public EditPart getEditPart();
}

Sonra sadece sizin createEditPart olarak yazabilirsiniz

public EditPart createEditPart(EditModel model) {
    return model.getEditPart();
}

(Aslında, bu kadar basit eğer belki de hiç createEditPart gerekmez). Eğer istemediğiniz ya da bunu yapamıyorsanız, size could dinamik modeli sınıfın adına göre parçası sınıfını seçer yansıması ile bir şey kurmak, ama bu gerçekten gereksiz yere karmaşık geliyor. Bu noktada kesinlikle fabrika deseni ile gidiş daha iyi olurdu.