Java 创建静态工厂

Java 创建静态工厂,java,processing,Java,Processing,我正在制作一个应用程序来控制串行连接的打印机,我想提供一个静态工厂方法PrinterLocator.FindPrinters,它将返回连接到我的系统的可用打印机阵列 例如,串行库提供了Serial.list,这是一种静态方法,返回与系统中可用端口对应的字符串数组。我正在尝试创建类似的东西,但是我得到一个错误,没有可以访问SLPDriver类型的封闭实例。必须使用SLPDriver类型的封闭实例限定分配 实现此设计模式的正确方法是什么 斯普德雷河: SerialPrinter myPrinter;

我正在制作一个应用程序来控制串行连接的打印机,我想提供一个静态工厂方法PrinterLocator.FindPrinters,它将返回连接到我的系统的可用打印机阵列

例如,串行库提供了Serial.list,这是一种静态方法,返回与系统中可用端口对应的字符串数组。我正在尝试创建类似的东西,但是我得到一个错误,没有可以访问SLPDriver类型的封闭实例。必须使用SLPDriver类型的封闭实例限定分配

实现此设计模式的正确方法是什么

斯普德雷河:

SerialPrinter myPrinter;


void setup()
{
  SerialPrinter[] availablePrinters = PrinterLocator.FindPrinters();
  if(availablePrinters.length > 0)
  {
    myPrinter = availablePrinters[0];
  }
}

void draw()
{
}
串行打印机:

import processing.serial.*;

static class PrinterLocator
{
  static final int baudRates[] = {2400, 4800, 9600, 19200, 38400, 57600, 115200};
  static final int baudCount = baudRates.length;

  static SerialPrinter[] FindPrinters()
  {
    SerialPrinter[] foundPrinters, tempPrinters;
    foundPrinters = new SerialPrinter[0];
    String[] foundPorts = Serial.list();
    int numPorts = foundPorts.length;
    int numPrintersFound = 0;
    if(numPorts <= 0) return foundPrinters;

    SerialPrinter testPrinter;

    tempPrinters = new SerialPrinter[numPorts];
    for(int i = 0; i < numPorts; i++)
    {
      for(int b = 0; b < baudCount; b++)
      {
        testPrinter = new SerialPrinter("test", foundPorts[i], baudRates[b]);
        if(testPrinter.IsValid())
        {
          tempPrinters[numPrintersFound] = testPrinter;
          numPrintersFound++;
          break;
        } 
      }
    }

    if(numPrintersFound > 0)
    {
      foundPrinters = new SerialPrinter[numPrintersFound];
      for(int i = 0; i < numPrintersFound; i++)
      {
        foundPrinters[i] = tempPrinters[i];
      }
    }

    return foundPrinters;
  }

}

class SerialPrinter
{
  //Members
  private Serial myPort;
  private String printerName;
  private boolean valid;
  private String portName;
  private int baudRate;

  public SerialPrinter()
  {
    this("","",0);  
  }

  public SerialPrinter(String name, String port, int baud)
  {
    printerName = name;
    Configure(port, baud);
  }

  public boolean IsValid()
  {
    return valid;
  }

  public boolean Configure(String port, int baud)
  {
    print("Configuring Printer ");
    print(port);
    print("@");
    print(baud);
    print(": ");
    try
    {
      myPort.stop();
      myPort = null;
    }
    catch (Exception e) {}

    portName = port;
    baudRate = baud;
    try
    {
      myPort = new Serial(this, port, baud);
      myPort.clear();
      myPort.write(0xA5);
      int timeout = millis() + 1000;
      while((millis() < timeout) && (myPort.available() == 0)) { }
      if(myPort.available() > 0)
      {
        int inByte = myPort.read();
        if(inByte == 0xC9)
        {
          valid = true;
        }
        else
        {
          valid = false;
        }
      }
      else
      {
        valid = false;
      }   
    }
    catch (Exception e)
    {
      valid = false;
    }
    if(valid)
    {
      println("[OK]");
    }
    else
    {
      println("[ERR]");
    }
    return valid;
  }
}
无法访问SLPDriver类型的封闭实例。必须使用SLPDriver类型的封闭实例限定分配

该错误表示SerialPrinter是SLPDriver的内部类

您需要将类声明更改为静态:

static class SerialPrinter
{
    ...
或者,如果它应该是内部的,则需要使用SLPDriver实例来创建串行打印机:

import processing.serial.*;

static class PrinterLocator
{
  static final int baudRates[] = {2400, 4800, 9600, 19200, 38400, 57600, 115200};
  static final int baudCount = baudRates.length;

  static SerialPrinter[] FindPrinters()
  {
    SerialPrinter[] foundPrinters, tempPrinters;
    foundPrinters = new SerialPrinter[0];
    String[] foundPorts = Serial.list();
    int numPorts = foundPorts.length;
    int numPrintersFound = 0;
    if(numPorts <= 0) return foundPrinters;

    SerialPrinter testPrinter;

    tempPrinters = new SerialPrinter[numPorts];
    for(int i = 0; i < numPorts; i++)
    {
      for(int b = 0; b < baudCount; b++)
      {
        testPrinter = new SerialPrinter("test", foundPorts[i], baudRates[b]);
        if(testPrinter.IsValid())
        {
          tempPrinters[numPrintersFound] = testPrinter;
          numPrintersFound++;
          break;
        } 
      }
    }

    if(numPrintersFound > 0)
    {
      foundPrinters = new SerialPrinter[numPrintersFound];
      for(int i = 0; i < numPrintersFound; i++)
      {
        foundPrinters[i] = tempPrinters[i];
      }
    }

    return foundPrinters;
  }

}

class SerialPrinter
{
  //Members
  private Serial myPort;
  private String printerName;
  private boolean valid;
  private String portName;
  private int baudRate;

  public SerialPrinter()
  {
    this("","",0);  
  }

  public SerialPrinter(String name, String port, int baud)
  {
    printerName = name;
    Configure(port, baud);
  }

  public boolean IsValid()
  {
    return valid;
  }

  public boolean Configure(String port, int baud)
  {
    print("Configuring Printer ");
    print(port);
    print("@");
    print(baud);
    print(": ");
    try
    {
      myPort.stop();
      myPort = null;
    }
    catch (Exception e) {}

    portName = port;
    baudRate = baud;
    try
    {
      myPort = new Serial(this, port, baud);
      myPort.clear();
      myPort.write(0xA5);
      int timeout = millis() + 1000;
      while((millis() < timeout) && (myPort.available() == 0)) { }
      if(myPort.available() > 0)
      {
        int inByte = myPort.read();
        if(inByte == 0xC9)
        {
          valid = true;
        }
        else
        {
          valid = false;
        }
      }
      else
      {
        valid = false;
      }   
    }
    catch (Exception e)
    {
      valid = false;
    }
    if(valid)
    {
      println("[OK]");
    }
    else
    {
      println("[ERR]");
    }
    return valid;
  }
}
串行构造函数似乎需要一个PApplet实例。实例化表达式也应该给您一个错误,因为它引用的是SerialPrinter,而不是PApplet

您可以尝试以下方法:

...

static class PrinterLocator {
    ...

    static SerialPrinter[] FindPrinters(SLPDriver context) {
        ...

        ... = context.new SerialPrinter(...);
    }
}

class SerialPrinter {
    ...

    public boolean Configure(...) {
        ...

        ... = new Serial(PApplet.this, ...);
    }
}
在小程序的上下文中调用findprants时,需要像

... = PrinterLocator.FindPrinters(this);

哪一行是错误?testPrinter=new SerialPrintertest,foundport[i],baudRates[b];在SerialPrinter中,Serial库的API文档表明Serial的构造函数需要引用该函数,而该函数在静态类的上下文中不存在。另外,我并不打算创建一个静态类,只是一个静态工厂方法。但你需要做我建议的一件事。你不可能在这里既有蛋糕又吃。你也应该认真阅读我链接的教程。静态类就像顶级类一样。请注意,如果在处理过程中声明顶级类,它实际上是内部的,因为全局上下文位于小程序的实例中。