Хотя я полностью согласен с тем, что «Статика — это неправильное использование здесь», я вроде как понимаю, что вы пытаетесь решить здесь. Тем не менее поведение экземпляра должно быть способом работы, но если вы настаиваете на том, что я бы сделал:
Начиная с вашего комментария «Мне нужно создать его экземпляр, чтобы получить строку, которая действительно статична в поведении»
Это не совсем правильно. Если вы хорошо выглядите, вы не меняете поведение своего базового класса, а просто меняете параметр для метода. Другими словами, вы меняете данные, а не алгоритм.
Наследование более полезно, когда новый подкласс хочет изменить способ работы метода, если вам просто нужно изменить «данные», которые класс использует для работы, возможно, такой подход поможет.
class ModelBase {
// Initialize the queries
private static Map<String,String> selectMap = new HashMap<String,String>(); static {
selectMap.put( "Album", "select field_1, field_2 from album");
selectMap.put( "Artist", "select field_1, field_2 from artist");
selectMap.put( "Track", "select field_1, field_2 from track");
}
// Finds all the objects for the specified class...
// Note: it is better to use "List" rather than "ArrayList" I'll explain this later.
public static List findAll(Class classToFind ) {
String sql = getSelectSQL( classToFind );
results = execute( sql );
//etc...
return ....
}
// Return the correct select sql..
private static String getSelectSQL( Class classToFind ){
String statement = tableMap.get( classToFind.getSimpleName() );
if( statement == null ) {
throw new IllegalArgumentException("Class " +
classToFind.getSimpleName + " is not mapped");
}
return statement;
}
}
То есть сопоставьте все операторы с Map. «Очевидным» следующим шагом является загрузка карты из внешнего ресурса, такого как файл свойств, xml или даже (почему бы и нет) таблица базы данных, для дополнительной гибкости.
Таким образом, вы можете поддерживать своих клиентов класса (и себя) счастливыми, потому что вам не нужно «создавать экземпляр» для выполнения работы.
// Client usage:
...
List albums = ModelBase.findAll( Album.class );
...
Другой подход заключается в создании экземпляров сзади и сохранении интерфейса клиента нетронутым при использовании методов экземпляра, методы помечены как «защищенные», чтобы избежать внешнего вызова. По аналогии с предыдущим образцом вы также можете сделать это
// Second option, instance used under the hood.
class ModelBase {
// Initialize the queries
private static Map<String,ModelBase> daoMap = new HashMap<String,ModelBase>(); static {
selectMap.put( "Album", new AlbumModel() );
selectMap.put( "Artist", new ArtistModel());
selectMap.put( "Track", new TrackModel());
}
// Finds all the objects for the specified class...
// Note: it is better to use "List" rather than "ArrayList" I'll explain this later.
public static List findAll(Class classToFind ) {
String sql = getSelectSQL( classToFind );
results = execute( sql );
//etc...
return ....
}
// Return the correct select sql..
private static String getSelectSQL( Class classToFind ){
ModelBase dao = tableMap.get( classToFind.getSimpleName() );
if( statement == null ) {
throw new IllegalArgumentException("Class " +
classToFind.getSimpleName + " is not mapped");
}
return dao.selectSql();
}
// Instance class to be overrided...
// this is "protected" ...
protected abstract String selectSql();
}
class AlbumModel extends ModelBase {
public String selectSql(){
return "select ... from album";
}
}
class ArtistModel extends ModelBase {
public String selectSql(){
return "select ... from artist";
}
}
class TrackModel extends ModelBase {
public String selectSql(){
return "select ... from track";
}
}
И вам не нужно менять клиентский код, и вы по-прежнему обладаете силой полиморфизма.
// Client usage:
...
List albums = ModelBase.findAll( Album.class ); // Does not know , behind the scenes you use instances.
...
Надеюсь, это поможет.
Последнее замечание об использовании List и ArrayList. Всегда лучше программировать для интерфейса, чем для реализации, так вы сделаете свой код более гибким. Вы можете использовать другую реализацию List, которая быстрее или делает что-то еще, не меняя клиентский код.
person
OscarRyz
schedule
30.09.2008