Как лучше всего передать объект в качестве параметра в метод Java?

Я хотел бы передать объект с именем user, созданный из класса Player, в свой метод playerSetup. Однако когда я передаю user в метод и пытаюсь вызвать user.setName(), Java выдает ошибку и рекомендует вместо этого сделать ((Player) user).setName(input.nextLine()). Это работает, но кажется немного запутанным, особенно если я собираюсь делать это и другими методами.

Есть ли лучший способ сделать это или я застрял на этом решении?

Main.java

public class Main {
    public static void main(String arg[]) {
        Scanner input = new Scanner(System.in);
        Player user = new Player();
        playerSetup(input, user);
        
        System.out.println(user.getName());
    }

    private static void playerSetup(Scanner input, Object user) {
        System.out.println("Hello, please enter your name: ");  
/*
        user.setName(input.nextLine()); -- I would like for it to look like this,
        however it won't work and my IDE reccomends I do it like the line below.
*/
        ((Player) user).setName(input.nextLine()); // This seems messy having to reference the Player class every time
        System.out.println("Hello " + ((Player) user).getName());
    }
}

Игрок.java

public class Player {
private String name;
    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return this.name;
    }
}

Просто объявите этот метод как playerSetup(Scanner input, Player user).

rzwitserloot 27.07.2024 04:13
docs.oracle.com/javase/tutorial
Basil Bourque 27.07.2024 05:06

кстати, даже если это разрешено, не рекомендуется записывать объявления массивов как String arg[]; the preferred way is String[] arg` (так как тип String[]). См. Разница между массивом int[] и массивом int[]

user85421 27.07.2024 10:44
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
3
73
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы избежать необходимости приведения user к Player в вашем методе playerSetup, вы можете изменить сигнатуру метода, чтобы явно принимать объект Player вместо общего Object. Таким образом, вы можете напрямую вызывать методы Player без приведения.

Вот как вы можете изменить свой класс Main:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        Player user = new Player();
        playerSetup(input, user);
        
        System.out.println(user.getName());
    }

    private static void playerSetup(Scanner input, Player user) {
        System.out.println("Hello, please enter your name: ");
        user.setName(input.nextLine());
        System.out.println("Hello " + user.getName());
    }
}

Изменив тип параметра playerSetup с Object на Player, вы теперь можете вызывать setName и getName непосредственно на объекте user без необходимости его приведения. Это делает ваш код чище и читабельнее.

Вот полный класс Player для справки:

public class Player {
    private String name;

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return this.name;
    }
}

Другие вопросы по теме