2013-03-08 3 views
1

Мне досадно добавлять статические Finders ко всем классам модели.static Finder из родительского класса

Почему не возможно сделать это:

@MappedSuperclass 
public class MyModel<T> extends Model { 

    public static Finder<Integer,T> FIND = new Finder<Integer, T>(Integer.class,T.class); 

} 

@SuppressWarnings("serial") 
@Entity 
public class ValidationScript extends MyModel<ValidationScript> { 

    @Id 
    public Integer id; 

    @Column(length = 5000) 
    public String scriptCode; 

} 
+1

Не решение, просто подсказка: большинство IDE теперь позволяют создавать какие-то динамические шаблоны кода, я добавил один в Idea и создавал правильный искатель при однократном нажатии клавиши. – biesior

+0

Могу ли я попросить вас опубликовать свой живой храм для идеи? – cosmolev

ответ

1

Шаблон довольно легко. Используйте этот шаблон вместо ручной добавив @Id поле и Finder

@javax.persistence.Id 
public $ID$ id; 

public static Finder<$ID$, $CL$> find 
     = new Finder<$ID$, $CL$>($ID$.class, $CL$.class); 

После вставить его в редакторе шаблона нажмите Edit variables и установить выражение для CL в className()

взглянуть на скриншоты

live template for Finder

live template variables

1

Я провел некоторое время, чтобы найти решение, потому что у меня такая же проблема, но это не проблема, связанная с Play/Ebean.

К сожалению, вы не можете сделать это на Java. По дизайну статическое поле разделяется всеми suclasses (одним и тем же объектом!). И, конечно, вы не можете иметь объект с несколькими типами! дженерики используются во время компиляции, чтобы проверить правильность методов вызова: http://docs.oracle.com/javase/tutorial/java/generics/genTypeInference.html

решение вы предложили с использованием дженериков не может работать, так как статическое поле/метод не может получить доступ к типу (все инстанции может иметь другой тип).

В вашем случае поле FIND разделяется для всех подклассов MyModel.


Я попытался преобразовать вам поле в статическом методе искатель() и создать «пул» искатель со статическим HashMap класса/видоискателем, но в любом случае вы должны предоставить класс, как этот MyModel.finder (ValidationScript. класс), потому что invoker всегда является суперклассом.

Слишком много многословным ...

+0

Thx для анализа. Это действительно не проблема Play, мне было просто интересно узнать о других разработчиках Play. Предложение biesior выглядит очень хорошо. – cosmolev

Смежные вопросы