Вызов функции из другого пакета - PullRequest
0 голосов
/ 04 марта 2020

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

wtchPrdct = createWatch(keyboard);

Она была расположена в моей основной функции для создания объекта Watch, как показано ниже

Watch wtchPrdct = null;

Поскольку моя программа работала довольно долго, так как я добавлял в нее что-то, я хотел взять некоторый вес из своего основного класса, и, таким образом, я создал пакет 'Utils', к которому я добавил моя функция createWatch () Однако я изо всех сил пытаюсь вызвать эту функцию сейчас. Я получаю сообщение «ошибка не может найти символ», если я придерживаюсь своей исходной строки:

wtchPrdct = createWatch(keyboard);

и изменяю способ, которым я называю свой метод, следующим образом:

Create wtchPrdct = new Create();
wtchPrdct = createWatch(keyboard);

но, к сожалению, возникла та же ошибка.

Я забыл упомянуть, что импортировал свою посылку: import Utils.Create;

package SportswearProduct;

import DBClass.Model;
import java.sql.SQLException;
import java.util.*;
import java.sql.Date;
import Utils.Create;

public class SSD_CA2 {

    public static void main(String[] args) throws SQLException {

        System.out.println("\n==================    MENU    ==================");

        do {
            /*  the user may choose beetwen CRUD interactions provided by the program   */
            System.out.println("\n1. Create a new Sportswear");
            System.out.println("2. Read Watch");
            System.out.println("3. Update Watch");
            System.out.println("4. Delete Watch");
            System.out.println("5. Exit");

            System.out.print("\nEnter option: ");

            /*  optCommand interprets as a string the command from the user, parse it as an Integer 
             *   & checks whether the command matches one of the CRUD interactions below  */
            String optCommand = keyboard.nextLine();
            opt = Integer.parseInt(optCommand);

            //  The program prompts a command feedback
            System.out.println("\nYou chose option " + opt);

            //  I use a do-while loop that iterates until the user prompts a correct command (see option 5)
            switch (opt) {

                case 1: {

                    System.out.println("\nWhat product would you like to add?");
                    System.out.println("1. A Watch");
                    System.out.println("2. Runners");

                    System.out.print("\nEnter option: ");
                    String createCmd = keyboard.nextLine();
                    int newOpt = Integer.parseInt(createCmd);

                    do {

                        switch (newOpt) {
                            case 1: {

                                System.out.println("\n==================    Create Watch    ==================");
                                /*  spwrPrdct will store the data of an object watch created in the function createWatch to which we pass
                                 *  as a parameter the method Scanner() */
                                Create wtchPrdct = new Create();                                
                                wtchPrdct = createWatch(keyboard);




                                //  once returned, prdctWatch id passed to the addWatch() function in Model.java
                                model.addWatch(wtchPrdct);
                                break;
                            }
                            case 2: {

                                //same process as above
                                System.out.println("\n==================    Create Runners    ==================");
                                runPrdct = createRunners(keyboard);

                                model.addRunners(runPrdct);
                                break;
                            }
                            default:
                                if (opt > 2) {
                                    /*  if the user inputs a value greater than 5, instead of stoping, the program prompts an error message 
                         *  & iterates again    */
                                    System.out.println("\n==================    ERROR    ==================");
                                    System.out.println("\nWrong command! select one or 2 :");
                                }
                        }

                        break;
                    } while (newOpt != 1 || newOpt != 2);

                }


    }



}


И вот моя функция:

package Utils;

import SportswearProduct.Sportswear;
import SportswearProduct.Runners;
import SportswearProduct.Watch;
import java.sql.Date;
import java.util.Scanner;

public class Create {

    Watch wtchPrdct = null;

    /*    --------------------   CREATE WATCH FUNCTION   --------------------   */
    /*  createWatch() passes Keyboard()so that the user may assign data to the object   */
    public static Watch createWatch(Scanner keyboard) {

        /*  the user enters data that is stored into a variable of matching datat type  */
        System.out.print("\nEnter the watch brand: ");
        String brand = keyboard.nextLine();

        System.out.print("Enter the date of sale (yyyy-mm-dd): ");
        Date onSale = Date.valueOf(keyboard.nextLine());

...


        Watch prdctWatch = new Watch(
                brand,
                onSale,
                price,
                movement,
                chargingType,
                batteryLife,
                waterProof
        );


        return prdctWatch;

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

Спасибо за вашу помощь.

Ответы [ 4 ]

1 голос
/ 04 марта 2020

Я думаю, что вы перепутали грамматику Java и языки сценариев, такие как Pyhon.

Поскольку ваш метод createWatch объявлен в классе Create, когда вы хотите вызвать этот метод, вы должны :

  • Либо вызовите этот метод, используя экземпляр класса Create:

    wtchPrdct = wtchPrdct.createWatch (клавиатура);

  • или вызовите этот метод, установив метод stati c, и вызовите его, используя имя класса:

    wtchPrdct = Create.createWatch (клавиатура);

0 голосов
/ 04 марта 2020

Только информация, не пытайтесь создать объект из метода Utils, создайте его с помощью приватного конструктора. В этом случае вы можете создать объект из класса Utils, но не можете использовать этот метод, так как он stati c. Помните, что методы stati c принадлежат классу, а не объекту. По этой причине используйте его так:

Create.createWatch(keyboard);

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

0 голосов
/ 04 марта 2020

Я немного запутался. Этот вопрос действительно о java? В основном функция в java не может быть независимой и не может принадлежать package . Функция должна принадлежать либо class (stati c), либо object .

Однако, если мы все еще говорим о java, я предполагаю Utils - это отдельный класс, например:

public class Utils {
   public Watch createWatch(Object keyboard) {
      // something important happens here 
   }
}

, если это так - createWatch принадлежит любому экземпляру Utils. Чтобы вызвать его, сначала нужно создать экземпляр:

new Utils().createWatch(keyboard);

или

Utils u = new Utils();
u.createWatch(keyboard);

В служебных целях вы можете использовать stati c

public class Utils {
   public static Watch createWatch(Object keyboard) {
      // something important happens here 
   }
}

в данном случае это часть класса, а не объекта:

Utils.createWatch(keyboard);

или вы можете вызвать его напрямую с помощью stati c import

package main;

import static utils.Utils.*;

public class Main {
    Object keyboard = new Object();

    public void someMainMethod() {
         createWatch(this.keyboard);
    }
}
0 голосов
/ 04 марта 2020

Ну, вы сделали несколько фундаментальных ошибок здесь в коде.

Take является частью кода, например:

Create wtchPrdct = new Create();                                
wtchPrdct = createWatch(keyboard);

Если вы хотите вызвать функцию createWatch() в классе Utils.Create, вы должны набрать как

Create.createWatch(keyboard)

Теперь следующая проблема заключается в том, что вы возвращаете тип Watch из метода createWatch(). Таким образом, вы не можете присвоить его переменной wtchPrdct, так как ее тип равен Create

Поэтому правильный вызов будет выглядеть как

Watch wtchPrdct = Create.createWatch(keyboard);

Теперь, если вы действительно хотите вызвать метод createWatch без Create типа, вы можете импортировать функцию статически, как

import static Utils.Create.createWatch.

Тип имеет значение в java. Поэтому возвращаемые значения должны принадлежать правильному типу.

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