Вы не получаете ожидаемого ответа, потому что вопрос немного сбивает с толку, как и сейчас. Внимательно читая его, вы не спрашиваете, может ли основной метод напрямую обращаться / изменять свойства Customer
, но может ли метод main
использовать методы add
и setGold
для изменения этих свойств. Кроме того, класс Seller
просто добавляет энтропию, поскольку это не имеет отношения к вопросу.
Разбивка на части:
Предоставляют ли методы "setGold" и "add" атрибуты?
Сами атрибуты не отображаются, но оба методы позволяют изменять эти атрибуты извне, поскольку они объявлены как publi c.
я не хочу, чтобы пользователь мог изменять itemCart, ни атрибут gold buy, ни просто вызовите add метод или установить золото самостоятельно
Это возможно с вашим текущим кодом, так как add
и setGold
публикуются c. Это и есть цель public
.
, но я хочу иметь к ним доступ, чтобы изменять их с помощью других методов, в данном случае из метода «купить» в классе Trade
Если вы хотите, чтобы add
и setGold
были видны только классу Trade
, один из вариантов - поместить классы Trade
и Customer
в тот же пакет, что и в следующем примере:
com.example
shopping
|--- Customer.java
|--- Trade.java
application
|--- HelloWorld.java
И затем сделайте оба метода package-private , например:
public Customer {
// ... properties and other methods
void setGold(int amount) {
if (gold - amount >= 0) {
gold -= amount;
}
}
void add(String item) {
itemCart.add(item);
}
}
Отличие от вашего кода в том, что ни один из методов не содержит модификатора видимости (удален public
ключевое слово), что делает их закрытыми для пакета и, следовательно, доступными только из одного и того же пакета.
С этой структурой и закрытыми для пакета методами в классе Customer
, если вы вызываете add
или setGold
из класса main
вы получите ошибку компилятора:
add(java.lang.String) is not public in com.example.shopping.Customer;
cannot be accessed from outside package
Но вы все равно можете получить к нему доступ из класса Trade
, потому что он находится в том же пакете.