简体   繁体   English

如何调用一个字符串出现在另一个类中

[英]How to call a string to appear in another class

I have this class called Main. 我有一个叫做Main的课程。 java. Java的 In this the output is shown by inputLine which is a string taken serially from the com port. 在这种情况下,输出由inputLine显示,它是从com端口串行获取的字符串。 i want this string value to be used in some other class which is in the same default package. 我希望此字符串值可用于同一默认包中的其他某个类。 How do i call this string in other class. 我如何在其他课堂上称呼这个字符串。 How do i create an instance of this class and call the string inputLine in any other xyz.java class. 如何创建此类的实例,并在任何其他xyz.java类中调用字符串inputLine。 An example would be very helpful. 一个例子将非常有帮助。

    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import gnu.io.CommPortIdentifier;
    import gnu.io.SerialPort;
    import gnu.io.SerialPortEvent;
    import gnu.io.SerialPortEventListener;
    import java.util.Enumeration;


public class Main implements SerialPortEventListener
{
    SerialPort serialPort;
        /** The port we're normally going to use. */
    private static final String PORT_NAMES[] = {
            "COM30", // Windows
    };
    /**
    * A BufferedReader which will be fed by a InputStreamReader
    * converting the bytes into characters
    * making the displayed results codepage independent
    */
    private BufferedReader input;
    /** The output stream to the port */
    private OutputStream output;
    /** Milliseconds to block while waiting for port open */
    private static final int TIME_OUT = 2000;
    /** Default bits per second for COM port. */
    private static final int DATA_RATE = 9600;

    public void initialize() {
        CommPortIdentifier portId = null;
        Enumeration portEnum = CommPortIdentifier.getPortIdentifiers();

        //First, Find an instance of serial port as set in PORT_NAMES.
        while (portEnum.hasMoreElements()) {
            CommPortIdentifier currPortId = (CommPortIdentifier) portEnum.nextElement();
            for (String portName : PORT_NAMES) {
                if (currPortId.getName().equals(portName)) {
                    portId = currPortId;
                    break;
                }
            }
        }
        if (portId == null) {
            System.out.println("Could not find COM port.");
            return;
        }

        try {
            // open serial port, and use class name for the appName.
            serialPort = (SerialPort) portId.open(this.getClass().getName(),
                    TIME_OUT);

            // set port parameters
            serialPort.setSerialPortParams(DATA_RATE,
                    SerialPort.DATABITS_8,
                    SerialPort.STOPBITS_1,
                    SerialPort.PARITY_NONE);

            // open the streams
            input = new BufferedReader(new InputStreamReader(serialPort.getInputStream()));
            output = serialPort.getOutputStream();

            // add event listeners
            serialPort.addEventListener(this);
            serialPort.notifyOnDataAvailable(true);
        } catch (Exception e) {
            System.err.println(e.toString());
        }
    }

    /**
     * This should be called when you stop using the port.
     * This will prevent port locking on platforms like Linux.
     */
    public synchronized void close() {
        if (serialPort != null) {
            serialPort.removeEventListener();
            serialPort.close();
        }
    }

    /**
     * Handle an event on the serial port. Read the data and print it.
     */
    public synchronized void serialEvent(SerialPortEvent oEvent) {
        if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
            try {
                String inputLine=input.readLine();
                System.out.println(inputLine);

            } catch (Exception e) {
                System.err.println(e.toString());
            }
        }
        // Ignore all the other eventTypes, but you should consider the other ones.
    }

    public static void main(String[] args) throws Exception {
        Main main = new Main();
        main.initialize();
        Thread t=new Thread() {
            public void run() {
                //the following line will keep this app alive for 1000 seconds,
                //waiting for events to occur and responding to them (printing incoming messages to console).
                try {Thread.sleep(1000000);} catch (InterruptedException ie) {}
            }
        };
        t.start();
        System.out.println("Started");
    }
}

First of all the variable has to be either an instance variable or a class variable if you want to access it somewhere else, variables created within a method can only exist inside of that method and will die as soon as the method returns. 首先,如果要在其他位置访问变量,则变量必须是实例变量或类变量,方法内部创建的变量只能存在于该方法内部,并且在该方法返回时将立即消失。

In order to access the variable from another class you have to make it available, there are no friends in Java as in C++. 为了从另一个类访问变量,必须使其可用,Java中没有C ++中的朋友。 You have 3 options. 您有3个选择。

  • Create a public instance variable, then provide a reference to the instance to those that need to access the information. 创建一个公共实例变量,然后为需要访问信息的实例提供对该实例的引用。
  • Create a private instance variable and public setter/getter methods to access it from the outside, then provide a reference to the instance to those that need to access the information. 创建一个私有实例变量和公共setter / getter方法以从外部访问它,然后为需要访问信息的实例提供对该实例的引用。
  • Create a public static (class) variable. 创建一个公共静态(类)变量。

In your case, you should just create a class variable. 就您而言,您应该只创建一个类变量。 Just declare inside the class, public static String inputLine; 只需在类内部声明, public static String inputLine; Change String inputLine=input.readLine(); 更改字符串inputLine = input.readLine(); to inputLine=input.readLine(); inputLine=input.readLine(); and you can access it from other classes in the same package using Main.inputLine. 并且您可以使用Main.inputLine从同一包中的其他类访问它。

Sounds like the Observer Pattern for me... 听起来像是我的观察者模式...

Create an Interface eg. 创建一个接口,例如 SerialListener that every class to be informed implements. 每个要通知的类都实现的SerialListener。 The interface has one method with string parameter that is called by your Main Class every time new information arrives. 该接口有一个带有字符串参数的方法,每当新信息到达时,您的主类就会调用该方法。 And of cause the main class has methods to register new listeners and stores them in a list 因此,主类具有注册新侦听器并将其存储在列表中的方法

List toBeCalled = new ArrayList() List toBeCalled = new ArrayList()

Just like other Listeners in Swing etc. 就像Swing等中的其他监听器一样

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM