为什么只有一个字段的行为如此?

时间:2014-07-08 23:34:15

标签: scala intellij-idea

我的情况非常简单......:

我有这个User课程:

package com.myapp.domain.model.user

class User private[user](private val _id: String,
                         private var _password: String = null,
                         private var _androidToken: String = null,
                         private var _iosDeviceToken: String = null) extends NodeIdentity with DomainEntityId[String] {

          private[model] def this() {
              this(null, null, null, null) //ugly but needed for Spring-Data
          }            
          //.........
}

及其相应的同伴:

object User {

  def create(.....): ValidationNel[IllegalUserFailure, User] = {
    new User("123", "456", "789", "111")
  }

}

奇怪的是在IntelliJ中进行调试时,我发现:

_id = "123"         
_password = "456"            
_androidToken = "789"              
com$myapp$domain$model$user$User$_iosDeviceToken = "111"     

可能是什么原因可以解释为什么只有_iosDeviceToken出现?喜欢......直接无法到达。
实际上,我只是简化了这个例子,但实际上它几乎就是这么简单。

不要弄清楚..

1 个答案:

答案 0 :(得分:2)

这意味着您需要以平台级别的私有访问方式访问该成员,因此对于Java,它会重命名以避免名称冲突。我发现你正在使用private[user]等等。

可能某处有重复的答案。

Here's an example在那里,我必须知道名称错误,稍作解释。

这是另一个例子,说明由于特定的编码,它会如何意外发生:

package mangled.user

class User private[user](private val _id: String,
                         private var _aToken: String = null,
                         private var _bToken: String = null) {
  private[mangled] def this() = this(null, null, null)

  def f = (1 to 3) map (_ => _bToken)
}

object User {
  def create = new User("x","y","z")
}

anonfun可以访问该成员:

scala> :javap -pv -fun mangled.user.User
[snip]
  public final java.lang.String apply(int);
    flags: ACC_PUBLIC, ACC_FINAL
    Code:
      stack=1, locals=2, args_size=2
         0: aload_0       
         1: getfield      #19                 // Field $outer:Lmangled/user/User;
         4: invokevirtual #23                 // Method mangled/user/User.mangled$user$User$$_bToken:()Ljava/lang/String;
         7: areturn   

成员们自己:

scala> :javap -p mangled.user.User
Compiled from "mangled.scala"
public class mangled.user.User {
  private final java.lang.String _id;
  private java.lang.String _aToken;
  private java.lang.String mangled$user$User$$_bToken;
  public static java.lang.String $lessinit$greater$default$3();
  public static java.lang.String $lessinit$greater$default$2();
  public static mangled.user.User create();
  private java.lang.String _id();
  private java.lang.String _aToken();
  private void _aToken_$eq(java.lang.String);
  public java.lang.String mangled$user$User$$_bToken();
  private void mangled$user$User$$_bToken_$eq(java.lang.String);
  public scala.collection.immutable.IndexedSeq<java.lang.String> f();
  public mangled.user.User(java.lang.String, java.lang.String, java.lang.String);
  public mangled.user.User();
}

_bToken的访问者已被公开。