如果未以这种方式设置,则发现Enum变量为null

时间:2019-03-28 08:02:51

标签: java enums null

每当我尝试从枚举中获取字段时,它总是返回null。 我已经根据枚举构造函数设置了它的值。它仍然显示为空。

  <key>NSAppTransportSecurity</key>
     <dict>
       <key>Allow Arbitrary Loads</key>
          <true/>
    </dict>

Point枚举类

public enum TeamType {
    RED("Red",ChatColor.RED,DyeColor.RED,Point.RED),
    BLUE("Blue",ChatColor.BLUE,DyeColor.BLUE,Point.BLUE);  //<----Set as Point.RED/BLUE



    private String name;
    private int crystalHealth = 50;
    private Point point;
    private int teamPoints;
    private ChatColor chatColor;
    private DyeColor dye;
    private HashSet<ArenaPlayer> playerList = new HashSet<>();
    private List<ArenaPlayer> queue = new ArrayList<ArenaPlayer>();
    private Location spawn;


    public Point getPoint()
    {
        if(point == null)
            System.out.println("WHY? for: " + this.toString()); //<---This always runs

        return point;
    }

    private TeamType(String name,ChatColor color,DyeColor dye,Point point1) {
        this.name = name;
        this.point = point1; // <--- My assignment
        this.dye = dye;
        this.chatColor = color;
    }

在我对Java的了解之外,显然发生了某些事情。 TeamType枚举时,可能尚未初始化Point Enum。这可以解释为什么它为空。

我需要一些帮助。

2 个答案:

答案 0 :(得分:3)

好吧,我认为问题的根源在于您有一个循环引用。 TeamType有一个Point参考,反之亦然。

假设TeamType枚举类已初始化,则枚举常量也被初始化。这些引用Point,而Point又被初始化。类加载器将加载TeamType类,但不会再次初始化using System.IO; using System.Net.NetworkInformation; using System.Net.Security; using System.Net.Sockets; public partial class Default3 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { // create an instance of TcpClient TcpClient tcpclient = new TcpClient(); tcpclient.Connect("pop3.live.com", 995); System.Net.Security.SslStream sslstream = new SslStream(tcpclient.GetStream()); sslstream.AuthenticateAsClient("pop3.live.com"); StreamWriter sw = new StreamWriter(sslstream); System.IO.StreamReader reader = new StreamReader(sslstream); sw.WriteLine("USER xxx@live.com"); sw.Flush(); sw.WriteLine("PASS xxxx****"); sw.Flush(); sw.WriteLine("RETR 1"); sw.Flush(); sw.WriteLine("Quit "); sw.Flush(); string str = string.Empty; string strTemp = string.Empty; while ((strTemp = reader.ReadLine()) != null) { if (".".Equals(strTemp)) { break; } if (strTemp.IndexOf("-ERR") != -1) { break; } str += strTemp; } Response.Write(str); reader.Close(); sw.Close(); tcpclient.Close(); // close the connection } } 。此时,您期望为非null的属性仍为null。


JLS § 12.4定义了此过程。

答案 1 :(得分:0)

假设我们有一个名为A的类,其中有B类的Object。 (以UML术语A表示B)。同时,我们的类B也由类A的对象组成(以UML术语B HAS A表示)。显然,这表示循环依赖性,因为在创建A的对象时,编译器必须知道B的大小...另一方面,在创建B的对象时,编译器必须知道A的大小。这有点像egg vs.鸡问题...

要避免此类循环依赖,您可以使用任何代理接口。

https://dzone.com/articles/tackling-circular-dependency