Что лучший способ состоит в том, чтобы копировать/расширить функциональность статического класса?

В вашем случае использование «Hey Siri» в качестве сравнения не является точным, поскольку эта функция опирается на выделенную SoC, в частности, для оптимизации энергопотребления. В вашем сценарии у вас нет выбора, кроме как потреблять ресурсы процессора, что приведет к более высокому энергопотреблению.

Несмотря на то, что потребуется дальнейшее тестирование, я предполагаю, что ваше энергопотребление будет не лучше, чем приложение в неактивном состоянии в лучшем случае (YMMV в зависимости от того, что еще делает ваше приложение).

https://machinelearning.apple.com/2017/10/01/hey-siri.html

Чтобы не запускать основной процессор весь день, только для прослушивания для триггерной фразы iPhone всегда включен (AOP) (небольшой вспомогательный процессор с низким энергопотреблением, то есть встроенный Motion Coprocessor) имеет доступ к сигналу микрофона (на 6S и более поздних версиях). Мы используем небольшую часть ограниченной вычислительной мощности AOP для запуска детектора с небольшой версией акустической модели (DNN).

blockquote>

Акустическая модель, на которую она ссылается, - это триггерная фраза «Hey Siri», которую она была высоко оптимизирована для обнаружения, снова возвращаясь к соображениям мощности и производительности.

5
задан Mehrdad Afshari 17 February 2009 в 20:28
поделиться

8 ответов

Сохраните статические методы и позвольте им делегировать к соответствующим методам экземпляра экземпляра по умолчанию.

Поскольку вторичные базы данных позволяют создавать больше экземпляров любыми средствами и получать доступ к ним через их методы экземпляра.

Затем можно отколоть в вызывающих сторонах статических методов, и когда их все уводят, удаляют статические методы.

2
ответ дан 14 December 2019 в 13:48
поделиться

Возможно, это не должно было быть статично во-первых.

2
ответ дан 14 December 2019 в 13:48
поделиться

Я посмотрел на этот вопрос давным-давно, и из-за точного вопроса Вы позируете, я решил никогда не сделать статические классы как это. Существует на самом деле 2 проблемы с ним...

Сначала это не является допускающим повторное использование (как Вы заметили), и фиксация его является жестким, осуществляют рефакторинг.

Во-вторых, у Вас не может быть второго экземпляра (Кажется, что программисты предполагают, что существует только одна из вещи почти так, как они предполагают, что никогда не должны будут изменять первые две цифры даты!)

Если Вы решаете желание второго экземпляра с шаблоном "фабрика" (или что-то как пружина), это - тривиальное изменение - просто передают в переменной фабрике для указания, какой экземпляр Вы хотите - но осуществлять рефакторинг от статического класса - просто сука.

Необходимо даже бояться злоупотреблять шаблонами "фабрика". Если Вы действительно склонитесь в том направлении, изучите и охватите пружину то - оно объединится с Вашими естественными стремлениями для улучшения кода границами.

1
ответ дан 14 December 2019 в 13:48
поделиться

Нет действительно хорошего пути, несколько раз нет никакого реального выбора кроме просто копии класса целая продажа и живой с дублированием.

Я знаю, что это звучит действительно плохим, но ад, сколько раз на самом деле изменил этот класс, так как он был скопирован с быть в спящем режиме документации?

Я уверен, что кто-то идет в suguest преобразование целого приложения, чтобы иметь управляемую пружину SessionFactory и так далее, но если Ваше приложение не, в спящем режиме "Привет Мир", затем я предположил бы, что это могло бы занять немного, чем несколько часов.

0
ответ дан 14 December 2019 в 13:48
поделиться

Наименее разрушительный способ зафиксировать это состоял бы в том, чтобы добавить 2-ю статическую переменную к классу, инициализировать 2-й SessionFactory в статическом блоке и затем изменить "currentSession" статический метод иметь Строковый параметр для выбора надлежащего экземпляра на основе Вас логика бизнеса/кода.

0
ответ дан 14 December 2019 в 13:48
поделиться

Существует два возможных ответа; давайте посмотрим на обоих.

Нужно преобразовать его в непомехи. Возможно это было бы лучше, чем статический интерфейс во-первых, так как у Вас есть конкретный объект (SessionFactory) позади интерфейса. Преимущество выполнения этого состоит в том, что Вы задерживаете создание SessionFactory, пока Вы не нуждаетесь в нем (и никогда не создаете его, если Вы не делаете). Сделайте статический метод получить объект HibernateUtil по умолчанию, создав его, если Вы не существуете. Вы можете или не можете хотеть разрешать второму HibernateUtil.

Другой путь состоит в том, чтобы создать совершенно новый статический объект HibernateUtil2, который делегирует к HibernateUtil в случае необходимости. Однако обратите внимание, что они не будут связаны друг с другом никаким подобным наследованию способом, потому что помехи не могут использоваться в интерфейсах.

Я рекомендовал бы первый маршрут, при этом все остальное было бы равно, но Ваш конкретный случай может гарантировать второе.

0
ответ дан 14 December 2019 в 13:48
поделиться

Изучите Spring. Если Вы уже используете, в спящем режиме, это не будет фрагмент для изучения достаточного количества Spring для решения этой проблемы. Исходные люди Spring уже решили эту проблему лучше, чем Вы когда-нибудь будете.

Транзакции Spring допустимы для JDBC, В спящем режиме, iBatis, или любая другая технология персистентности это Пружинные опоры. Если Вы уже используете Spring, не переосмысливайте то, что они уже добились большего успеха. Используйте их транзакции.

Если у Вас есть больше чем одна база данных, и Вы выполняете записи обоим как единица работы, Вы знаете достаточно для использования драйверов XA для обоих, правильно?

0
ответ дан 14 December 2019 в 13:48
поделиться

Ну, это - правильное время для создания вещей правильно.

Нет никакого способа добавить второе соединение И сохранить шаблон, который Вы описали.

Вместо этого можно попытаться разобраться в вещах.

У Вас есть две опции.

Первая опция. Сохраните путаницу и сделайте ее немного худшей (не говоря Вашим клиентам)

  1. Создайте служебный класс, которые обрабатывают соединения для Вас. На этот раз не ограничивайте только двумя. Используйте карту вместо этого и не делайте ее статичной.
  2. Измените свое статическое использование класса что новый вспомогательный объект.
  3. Создайте свою новую утилиту (HibernateUtility2) соединения и использование что новый вспомогательный объект также.

    // Create a new utility class using a map instead.
    class HibernateUtility { 
    
        private Map<String, SessionFactory> factories;
        private HibernateUtility instance;
    
        public  static HibernateUtility getInstance() { 
            if( instance == null ) { 
            instance = new HibernateUtility();
            }
            return instance;
        }
    
        private HibernateUtility() {}
    
        private void check( String whichConnection ) { 
            if( !factories.containsKey( whichConnection ) ) {
                // start the connection
                factories.put( whichConnection, new Configu..
                //... etc etc ().configure().buildSessionFactory() );
            }
        }
    
        void openSession( String whichConnection ) {
            check( whichConnection );
            //open session with sessionFactory
            factories.get( whichConnection ).open(); //etcetc
        }
    
        Session currentSession( whichConnection ) {
            check( whichConnection );
            //return the currently open session
            factories.get( whichConnection ) .....
        }
    
        void closeSession( String whichConnection ) {
            check( whichConnection );
            //close the currently open session
            factories.get( whichConnection );
        }       
    }
    
    //------------------------------------------
    // Make your existing class call that class
    public class HibernateUtil {
    
        static void openSession() {
            //open session with sessionFactory
            HibernateUtility.getInstance( "one" ).openSession();
        }
    
        public static Session currentSession() {
            //return the currently open session
            HibernateUtility.getInstance( "one" ).currentSession();
        }
    
        static void closeSession() {
            //close the currently open session
            HibernateUtility.getInstance( "one" ).closeSession();
        }
    }
    
    //------------------------------------------            
    // Make the new connection use that class too.
    public class HibernateUtil {
    
        static void openSession() {
            //open session with sessionFactory
            HibernateUtility.getInstance( "two" ).openSession();
        }
    
        public static Session currentSession() {
            //return the currently open session
            HibernateUtility.getInstance( "two" ).currentSession();
        }
    
        static void closeSession() {
            //close the currently open session
            HibernateUtility.getInstance( "two" ).closeSession();
        }
    }
    

Таким образом, существующий клиентский код не повредится.

Вторая опция. Разгребите бардак и измените код соответственно.

В этой второй опции Вы создаете объект, очень похожий на HibernateUtility, описанный прежде, но на этот раз Вы не добавляете методы openSession, ни closeSession, которые не принадлежат тому интерфейсу.

Используя это не статический метод позволяет нам, Вы создаете различные экземпляры, которые могли соединиться с различными конфигурациями.

Вы просто просто используете currentSession, который, если сессия не делает, существует, создает новый, и получите как параметр идентификатор (во многом как "один" и "два" в предыдущем образце)

В этой второй опции необходимо изменить клиентский код для использования правильной реализации.

Примечание: Somethings неправильно с форматированием кода в Так, мне потребовалось некоторое время для форматирования его способ, которым это, и это не смотрит никакая польза :(

1
ответ дан 14 December 2019 в 13:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: