На самом деле есть способ проверить, кто называется конструктор или метод:
по следственным текущему стеку.
Не то, что я рекомендовал бы это, но эй, это работает:
public ParkingSlip() {
// get the current stack trace
// element 0: java.lang.Thread.getStackTrace
// element 1: this constructor
// element 2: the class/method calling this constructor
StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
// verify that it was indeed the ParkingMeter who invoked the constructor
if (!ParkingMeter.class.getName().equals(stackTrace[2].getClassName())) {
throw new IllegalAccessError("Restricted access, only ParkingMeter is allowed to create instances");
}
}
чистое решение, который resticts доступ конструктора во время компиляции (решение выше только во время выполнения проверок) является
- место
ParkingMeter
и ParkingSlip
(только те два) в специальном пакете
- оставить оба класса
public
- сделать конструктор (ы) е или
ParkingSlip
«дружественный» (ни private
, ни protected
, ни public
)
Это гарантирует, что ParkingSlip
конструкторы могут быть доступны только по классам в том же пакете, а также ParkingMeter
является единственным классом в этом пакете, у вас есть то, что вы хотите.
public class ParkingSlip {
// 'friendly' constructor
ParkingSlip() {
}
}
Используйте частный конструктор для парковки. http://stackoverflow.com/questions/17342815/what-is-the-use-of-private-constructor-in-java – chiaboy
Сделайте ParkingSlips частным внутренним классом в ParkingMeter. Затем напишите метод getter, чтобы получить ParkingSlips (а не сеттер). Возьмите автомобиль, чтобы получить геттер в ParkingMeter –
Да, конечно. Вы можете увидеть Внутренний класс: https: //docs.oracle.com/javase/tutorial/java/javaOO/innerclasses.html. Вы можете сделать ParkingSlip внутренним классом ParkingMeter. Автомобиль может получить объект ParkingSlip через геттер. – MageXellos