Поля в интерфейсах
У меня есть основной вопрос на 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;
...
}
у вас также есть перечисления, если вам нужно представляют собой набор постоянных полей с определенным значением. Я не вижу никакого "варианта использования", где вам действительно нужны константы в интерфейсе. Но может быть неправильно:)