虽然我早些时候在这里回答了一些问题,但最近我一直在做的一些工作中,我一直在想为什么Java不支持对其内置类进行方法链接.
Car例如,如果我要创建一个类,我可以通过reutrning 而不是void来使它可链接,this如下所示:
public class Car {
private String make;
public Car setMake(String make) {
this.make = make;
return this;
}
}
Run Code Online (Sandbox Code Playgroud)
内置库不倾向于以这种方式做事有什么特别的原因吗?方法链是否存在缺点?
我可能忽略了一些可以解释缺少方法链接的东西,但是默认情况下返回void的任何setter方法应该返回对此的引用(至少在我看来应该如此).这将使以下情况变得更加清洁.
container.add((new JLabel("label text")).setMaximumSize(new Dimension(100,200)));
Run Code Online (Sandbox Code Playgroud)
而不是更长时间的啰嗦:注意:如果你愿意,它不会阻止你以这种方式编码.
JLabel label = new JLabel("label text");
label.setMaximumSize(new Dimension(100,200));
container.add(label);
Run Code Online (Sandbox Code Playgroud)
我非常有兴趣听到这个决定背后的原因,如果我不得不猜测会有与此相关的开销,所以只应在需要时使用.
在PHP中可以做这样的事情:
myFunction( MyClass::staticMethod );
Run Code Online (Sandbox Code Playgroud)
这样'myFunction'将引用静态方法并能够调用它.当我尝试它时,我得到一个"Undefined class constant"(PHP 5.3)的错误,所以我想这不是直接可能的,但有没有办法做类似的事情?我到目前为止最接近的是将"函数"作为字符串传递并使用call_user_func().
我想知道为什么以下程序会抛出一个NPE
public static void main(String[] args) {
Integer testInteger = null;
String test = "test" + testInteger == null ? "(null)" : testInteger.toString();
}
Run Code Online (Sandbox Code Playgroud)
而这个
public static void main(String[] args) {
Integer testInteger = null;
String test = "test" + (testInteger == null ? "(null)" : testInteger.toString());
}
Run Code Online (Sandbox Code Playgroud)
没有.这当然是一个优先考虑的问题,我很好奇连接是如何工作的.
我知道一些关于iOS编程的基本知识,现在我想将我的应用程序连接到另一个非iphone设备,例如连接到可以控制灯泡打开和关闭的蓝牙设备,或控制任何家具.
我的问题是,除了iOS xcode,我需要学习什么样的程序才能实现我的目标?
有什么资料可供我学习吗?
这似乎是一个非常简单和愚蠢的问题,但我发现的一切都太复杂了,我无法理解.
我有这两个非常基本的联立方程式:
X = 2x + 2z
Y = z - x
Run Code Online (Sandbox Code Playgroud)
鉴于我知道X和Y,我将如何找到x和z?手动完成它很容易,但我不知道如何在代码中完成.
当用户点击我的应用程序中的图标时,我希望应用程序首先检查设备是否已连接到互联网,然后根据收到的结果执行某些操作(因为知道它只是弹出一个对话框,通知设备是否是是否连接).所以我写了这段代码:
public class MainActivity extends Activity {
// SOME CONSTANTS WILL BE DEFINED HERE
AlertDialog.Builder builder = new AlertDialog.Builder(this);
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.icoMyIcon).setOnClickListener(listener);
}
private OnClickListener listener = new OnClickListener() {
public void onClick(View v) {
if (isNetworkConnected()) {
builder.setMessage("Internet connected!").setCancelable(false)
.setPositiveButton("OK", null);
builder.create().show();
} else {
builder.setMessage("Internet isn\'t connected!")
.setCancelable(false)
.setPositiveButton("OK", null);
builder.create().show();
}
}
};
// Check if the device is connected to the Internet
private boolean isNetworkConnected() {
ConnectivityManager cm = (ConnectivityManager) …Run Code Online (Sandbox Code Playgroud) 我完全糊涂了,我一直用hibernate创建我的第一个Spring应用程序,当我从数据库中延迟加载对象时,我似乎无法发现我的错误.
我的模型如下
团队课
@Entity
public class Team {
@Id
@Column
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
@Column
private String name;
@Column
private String description;
@OneToMany(fetch=FetchType.LAZY , cascade = CascadeType.ALL, mappedBy="team")
@JsonIgnore
public List<Person> members;
//Constructors and setters getters ommited
}
Run Code Online (Sandbox Code Playgroud)
人类
@Entity
@Table(name="`person`")
public class Person {
@Id
@Column
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
@Column
private String name;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="team")
@JsonIgnore
private Team team;
//omitted constructor and methods
}
Run Code Online (Sandbox Code Playgroud)
然后我有我的数据访问对象,它们都遵循相同的模式
@Repository
public class TeamDaoImpl implements TeamDao {
@Autowired
private SessionFactory session;
@Override
public …Run Code Online (Sandbox Code Playgroud) 我已经花了一些时间思考不同的解决方案,因为我已经阅读过(我还没有真正熟悉Java),使用它作为构造函数参数通常不是一个好习惯.
我要做的是实例化JobGroupMod类的几个对象,并且对于每个JobGroupMod,我必须创建一定数量的JobMod对象,这些对象必须能够引用它们已经从中生成的JobGroupMod对象.
为了实现这一点,我将"this"传递给JobMod构造函数,但是,即使工作,它也不像是正确的设计.
public class JobGroupMod implements JobGroup {
public JobGroupMod(Node n,Set<Job> clusterJobs){
JobMod j=new JobMod(n,this);
}
}
Run Code Online (Sandbox Code Playgroud)
现在是JobMod类:
public class JobMod implements Job {
public JobMod(Node n, JobGroup jg){
setJobGroup(jg);
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,有没有更好的解决方法,或者我的解决方案是建议的方式?
对于以下代码,
If Sheets("sheet1").Range("A1").Value = "option_1" Then
Sheets("sheet1").Range("A1").Value = "option_2"
ElseIf Sheets("sheet1").Range("A1").Value = "option_2" Then
Sheets("sheet1").Range("A1").Value = "option_3"
ElseIf Sheets("sheet1").Range("A1").Value = "option_3" Then
Sheets("sheet1").Range("A1").Value = "option_4"
...
End IF
Run Code Online (Sandbox Code Playgroud)
和
Select Case Sheets("sheet1").Range("A1").Value
Case Is = "option_1"
Sheets("sheet1").Range("A1").Value = "option_2"
Case Is = "option_2"
Sheets("sheet1").Range("A1").Value = "option_3"
Case Is = "option_3"
Sheets("sheet1").Range("A1").Value = "option_4"
...
End Select
Run Code Online (Sandbox Code Playgroud)
问题:
1)我想知道哪条路会更快.如果可能的话,技术细节可以解释一下吗?
2)无论效率如何,在这种情况下我应该使用哪种方法,以获得更好的编码.
3)从数组中圈出值的任何其他"简单"方法?
我有一个全新的Laravel 5安装,事实上我已经在多个版本上尝试了这个并继续遇到同样的问题.
除了将会话驱动程序设置为redis之外,我没有更改默认设置.(基于文件也有同样的问题).
我有两条路线设置如下
Route::get('/set/{value}', function($value) {
var_dump(Session::getId());
Session::set('test', $value);
return view('welcome');
});
Route::get('/get', function() {
return 'Get ' . Session::get('test');
});
Run Code Online (Sandbox Code Playgroud)
如果我访问url/set/abc,我看到会话出现在REDIS中(我也看到了使用基于文件时创建的文件).会议在REDIS中看起来很好,如下所示
127.0.0.1:6379> KEYS *
1) "laravel:1a3ae6caff6346e4a173fdc1ab4c6eb0f138806b"
2) "laravel:fed1af2fb44c6e625953237c3fa6fcbb05366a5c"
3) "laravel:cb37286ccfe3e7caa20557aca840f50cb5a5f20d"
Run Code Online (Sandbox Code Playgroud)
每次我访问该页面时,它都会重新创建一个新会话.
session.php文件的关键部分如下:
'lifetime' => 120,
'expire_on_close' => false,
Run Code Online (Sandbox Code Playgroud)
我还在REDIS中检查了会话变量的TTL,它们确实在120分钟时初始化(相当于秒).
知道我做错了什么吗?
值得注意的是,我正在使用宅基地vm(完全库存)来测试这一点.我也试过使用多个浏览器.没有cookie被发送到浏览器,我假设会话ID应作为初始get请求的一部分发送到浏览器?