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

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

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

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

4 ответов


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

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


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

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

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

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

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

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


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

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

    /** @returns the given entity's 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);
}

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

public class Constants {
    private Constants() { }

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

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