Подтвердить что ты не робот

Поля в интерфейсах

У меня есть основной вопрос в Java, но это общий вопрос в ООП. Почему интерфейсы позволяют устанавливать поля? Разве это не противоречит тому, что должен делать интерфейс?

Как я это понял, интерфейс - это то, что на английском языке было бы прилагательным. Итак, если мой класс реализует интерфейсы Runnable и Serializable, я гарантирую пользователю, что мой класс будет удовлетворять условиям Runnable и Seriablizable. Однако это означало бы, что интерфейсы "неактивны", но им разрешено иметь поля в Java...

Я что-то пропустил?

4b9b3361

Ответ 1

Все поля в интерфейсе public static final, т.е. они являются константами.

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

Ответ 2

Прежде всего, существует разница между OOP paradigm и реализацией OOP в Java, поэтому одни и те же слова могут означать разные вещи.

В ООП интерфейс парадигмы - это то, что можно сделать с объектом (или что объект может сделать для вас). Любой объект может иметь несколько интерфейсов и, следовательно, играть разные роли. Например, кто-то может работать программистом и иметь возможность создавать программы, но в то же время он может быть мужем и отцом и, таким образом, иметь возможность оплачивать счета для своей семьи и заботиться о детях. Здесь "программист", "муж" и "отец" являются интерфейсами, а человек - объектом, который их реализует. Обратите внимание, что интерфейсы не подразумевают наличие каких-либо конкретных функций (полей) для реализации объекта, а просто действия, которые этот объект должен выполнять.

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

Но как насчет полей констант (public final static)? Являются ли они частью реализации или интерфейса. Это может быть и то, и другое. Например. Интерфейс "программист" может иметь постоянный WORK_HOURS установлен на "8". Таким образом, Java позволяет также описывать константы в интерфейсах.

Обратите внимание, что Java только помогает вам создать хороший дизайн ООП, но он не требует этого. В частности, не все общедоступные методы объекта должны существовать и в интерфейсе. Например, методы getter и setter обычно общедоступны, но на самом деле они являются частью реализации, а не интерфейсом, и поэтому не стоит вводить их в интерфейс.

(Пожалуйста, также обратите внимание, что большинство вещей, которые я описал здесь, относятся к основному ООП, как в Java, но есть и другие типы ООП, такие как прототип, в частности, реализованные в JavaScript).

Ответ 3

Что, если этот интерфейс относится к константам? Не было бы естественно объявить их в интерфейсе?

interface IdFinder {
    Serializable UNSAVED = new Serializable() {};

    /** @returns the given entity persistent identity, 
                 or {@link UNSAVED} if it hasn't been saved yet, 
                 or null if o is a value object that hasn't a 
                 persistent identity of its own.
     */
    Serializable getId(Object o);
}

Ответ 4

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

public class Constants {
    private Constants() { }

    public static final int ZERO = 0;
    public static final int SOME_COMPLEX_NUM = 2124132L;
    ...
}

У вас также есть перечисления, если вам нужно представить набор постоянных полей с некоторым значением. Я не вижу никакого "варианта использования", где вам действительно нужны константы в интерфейсе. Но может быть неправильно:)