0
 public enum Singleton  {
            INSTANCE;
            String fromLocation;
            String toLocation;

            private void initialise(String fromLocation, String toLocation) {
                this.fromLocation = fromLocation;
                this.toLocation = toLocation;
            }

            public static void main(String[] args) {
                Singleton s = INSTANCE;
                s.initialise(args[0],args[1]);
            }
    }

我似乎无法理解具有普通 Java 类构造函数的语法,我也可以从主例程传递 args。初始化程序对我来说似乎是一种难闻的气味 - 但这是我能想到的最好的。有什么建议么?

4

3 回答 3

1

enum您的方法的问题源于s 与单例一样好的主要原因。

让我提出一个与薛定谔的猫思想实验的类比。Anenum就像猫的状态,当盒子打开时,它会立即完全知道,并永远保持这种状态。这是由 an 的性质所保证的enum,即无论许多人在框中看什么,它只是cat 状态的第一个查看者,它实际上导致 cat 具有一个状态。其他人都看到了那一刻的精确副本。

因此,您有两种方法可以将外部数据安装到enum. 你可以保证是第一个打开盒子的人,或者——在这里我稍微扩展一下类比——你教猫在盒子第一次打开时快速伸出手来抓住它的状态。

选项 1 与实现单例一样复杂。绝对确定自己是第一几乎是不可能的。

所以选项 2 可能看起来像:

public enum Singleton {

  INSTANCE;
  final String fromLocation;
  final String toLocation;

  private Singleton () {
    // Reach out.
    this.fromLocation = App.args[0];
    this.toLocation = App.args[1];
  }
}

你的App入口点看起来像:

class App {
  static String[] args;

  public static void main(String args[]) {
    App.args = args;
  }
}

这里有可怕的警告。首先,如果你不启动它,每个使用你的单例的应用程序都会中断App.main。其次,如果您在App班级的任何地方访问您的单身人士,它可能会中断。

于 2013-09-18T22:30:56.477 回答
0

你的意思可能是这样的:

public class Singleton {
  private static Singleton instance;
  public static void getInstance() {
    if (instance == null)
      throw new IllegalStateException("Singleton not initialized!");
    return instance;
  }
  public static void init(String from, String to) {
    if (instance != null)
      throw new IllegalStateException("Singleton already initialized!");
    instance = new Singleton(from, to);
  }
  private final String from;
  private final String to;
  private Singleton(String from, String to) {
    this.from = from;
    this.to = to;
  }
}

显然,这不是线程安全的等等。但老实说,你最好使用像 Spring 或 Guice 这样的依赖注入框架。从长远来看,您的代码中的此Singleton.getInstance()调用不是您想要的...

为什么不使用/定义枚举?它说“枚举类型是一种特殊的数据类型,它使变量能够成为一组预定义的常量。” Java 教程中。而且你显然没有处理一些常数。

于 2013-09-18T23:11:44.837 回答
0

不,enum构造函数的工作方式是

public enum Singleton {
     A("from", "too"),
     B("from2", "too2");

     private String from, to;

     private Singleton(String from, String too) {
         this.from = from;
         this.too = too;
     }
}

你真正想要达到什么目的?也许 anenum不是您想要的,特别是如果您希望在运行时为其分配值。

于 2013-09-18T21:30:27.723 回答