Как я могу получить драйвер Windows 7 в Центр обновления Windows?

Лично я считаю, что это недостаток в дизайне Java. Да, да, я понимаю, что нестатические методы привязаны к экземпляру, в то время как статические методы привязаны к классу и т. Д. И т. Д. Однако рассмотрим следующий код:

public class RegularEmployee {
    private BigDecimal salary;

    public void setSalary(BigDecimal salary) {
        this.salary = salary;
    }

    public static BigDecimal getBonusMultiplier() {
        return new BigDecimal(".02");
    }

    public BigDecimal calculateBonus() {
        return salary.multiply(getBonusMultiplier());
    }

    /* ... presumably lots of other code ... */
}

public class SpecialEmployee extends RegularEmployee {
    public static BigDecimal getBonusMultiplier() {
        return new BigDecimal(".03");
    }
}

Этот код не будет работать как и следовало ожидать. А именно, SpecialEmployee получает бонус в размере 2%, как и обычные сотрудники. Но если вы удалите «статические», то SpecialEmployee получит 3% бонус.

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

Мне кажется вполне правдоподобным, что вы можете захотеть чтобы сделать getBonusMultiplier статическим. Возможно, вы хотите показать мультипликатор бонуса для всех категорий сотрудников без необходимости иметь экземпляр сотрудника в каждой категории. Какой смысл искать такие примеры? Что делать, если мы создаем новую категорию сотрудников и пока не имеем каких-либо сотрудников, назначенных ей? Это логически статическая функция.

Но это не сработает.

И да, да, я могу думать о любом количестве способов переписать вышеприведенный код, чтобы сделать это Работа. Я не хочу, чтобы он создавал неразрешимую проблему, но создавал ловушку для неосторожного программиста, потому что язык не ведет себя так, как я думаю, разумный человек будет ожидать.

Возможно, если бы я попытался написать компилятор для языка ООП, я бы быстро понял, почему его реализовать, чтобы статические функции могли быть переопределены, было бы трудно или невозможно.

Или, может быть, есть веская причина, почему Java ведет себя таким образом. Может ли кто-нибудь указать на преимущество этого поведения, какую-то категорию проблемы, которая облегчается этим? Я имею в виду, не просто указывайте мне на спецификацию языка Java и скажите «см., Это документировано, как оно себя ведет». Я знаю это. Но есть ли веская причина, почему ему так надо? (Кроме того, очевидное «заставить работать правильно было слишком сложно» ...)

Обновить

@VicKirk: Если вы имеете в виду, что это «плохой дизайн», как Java обрабатывает статику, мой ответ: «Ну, ну, конечно». Как я сказал в своем оригинальном посте, это не сработает. Но если вы имеете в виду, что это плохой дизайн в том смысле, что в нем будет что-то принципиально неправильное с языком, где это сработало, то есть, где статика может быть переопределена, как и виртуальные функции, что это каким-то образом приведет к двусмысленности, или было бы невозможно эффективно или что-то подобное, я отвечаю: «Почему? Что не так с концепцией?»

Я думаю, что пример, который я даю, - это очень естественная вещь, которую нужно делать. У меня есть класс, который имеет функцию, которая не зависит от каких-либо данных экземпляра и которую я могу очень разумно вызывать независимо от экземпляра, а также желать вызвать из метода экземпляра. Почему это не работает? На протяжении многих лет я сталкивался с этой ситуацией довольно много. На практике я обхожу его, создавая функцию virtual, а затем создаю статический метод, единственной целью которого является статический метод, который передает вызов виртуальному методу с фиктивным экземпляром. Это похоже на очень окольный путь.

0
задан Community 21 January 2019 в 17:37
поделиться